Problema F # Asp.Net CodeDom ProviderOptions
-
20-09-2019 - |
Pregunta
Estoy creando una aplicación ASP.NET MVC usando F # en IIS 7.
Cuando intento ejecutar desde el navegador, me encontré con un YSOD que contiene lo siguiente:
[ArgumentNullException: El valor no puede ser nulo. Nombre de parámetro: diccionario]
System.Collections.Generic.Dictionary2..ctor(IDictionary
2 diccionario, IEqualityComparer`1 comparador) +12700827
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderWithPropertyOptions (Tipo codeDomProviderType) 84
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderNonPublic (Tipo codeDomProviderType) 16
System.Web.Compilation.AssemblyBuilder..ctor (CompilationSection compConfig, ICollection referencedAssemblies, CompilerType compilerType, Cadena outputAssemblyName) 469
System.Web.Compilation.CompilerType.CreateAssemblyBuilder (CompilationSection compConfig, ICollection referencedAssemblies, Cadena generatedFilesDir, Cadena outputAssemblyName) 127
System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () 675 System.Web.Compilation.BuildProvidersCompiler.PerformBuild () 46 System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +11321455
System.Web.Compilation.BuildManager.CompileGlobalAsax () 50 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () 872
Miré hacia arriba usando el método del reflector para ver si me podía dar más contexto y se encontró que estaba fallando en la primera línea
private static CodeDomProvider CreateCodeDomProviderWithPropertyOptions(Type codeDomProviderType)
{
IDictionary<string, string> providerOptions = new Dictionary<string, string>(GetProviderOptions(codeDomProviderType));
//Snip
}
Me lleva a pensar que los propertyOptions he especificado en mi Web.config para el F # CodeDom son incorrectos. Sin embargo, si yo les quito recibo el mismo error.
<system.codedom>
<compilers>
<compiler language="F#;f#;fs;fsharp" extension=".fs" warningLevel="4"
type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider,
FSharp.Compiler.CodeDom">
<providerOption name="CompilerVersion" value="v4.0"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
¿Alguna idea sobre cómo corregir este error?
Solución 2
He encontrado la causa del problema.
El Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider.FileExtension está codificado a "FS".
Dentro de CompilerInfos System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor()
se crean para cada uno de los idiomas permitidos. Un CompilerInfo para FSharp no se encuentra dentro de la creación de este.
internal CodeDomCompilationConfiguration()
{
this._compilerLanguages = new Hashtable(StringComparer.OrdinalIgnoreCase);
this._compilerExtensions = new Hashtable(StringComparer.OrdinalIgnoreCase);
this._allCompilerInfo = new ArrayList();
CompilerParameters compilerParams = new CompilerParameters();
compilerParams.WarningLevel = 4;
string codeDomProviderTypeName = "Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
CompilerInfo compilerInfo = new CompilerInfo(compilerParams, codeDomProviderTypeName);
compilerInfo._compilerLanguages = new string[] { "c#", "cs", "csharp" };
compilerInfo._compilerExtensions = new string[] { ".cs", "cs" };
compilerInfo._providerOptions = new Dictionary<string, string>();
compilerInfo._providerOptions["CompilerVersion"] = "v4.0";
this.AddCompilerInfo(compilerInfo);
compilerParams = new CompilerParameters();
compilerParams.WarningLevel = 4;
codeDomProviderTypeName = "Microsoft.VisualBasic.VBCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
compilerInfo = new CompilerInfo(compilerParams, codeDomProviderTypeName);
compilerInfo._compilerLanguages = new string[] { "vb", "vbs", "visualbasic", "vbscript" };
compilerInfo._compilerExtensions = new string[] { ".vb", "vb" };
compilerInfo._providerOptions = new Dictionary<string, string>();
compilerInfo._providerOptions["CompilerVersion"] = "v4.0";
this.AddCompilerInfo(compilerInfo);
//Snip
}
El FileExtension se compara contra _compilerExtensions
en System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow
que (en el caso de "FS") devuelve un valor nulo a System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension
que luego volver falsa a System.Web.Compilation.CompilationUtil.GetProviderOptions
que devuelve el nula de que estaba causando el ArgumentNullException.
Gracias por señalarme en la dirección correcta, @ Brian
Otros consejos
Es un error en ASP.NET en VS2010 Beta2 (que ya ha sido fijada, por lo que trabajará en la próxima versión). Afecta a cualquier tercero proveedor de CodeDOM partido, y no creo que hay alguna solución.
Tal vez el error de Brian observó se puede evitar mediante la especificación de un poco más de información en web.config:
type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider,
FSharp.Compiler.CodeDom,
Version=1.9.7.8,
Culture=neutral,
PublicKeyToken=a19089b1c74d0809"