deploy - ¿Acceder a la configuración de Web.config en Asp.Net Core App?
publish asp net core project to iis (3)
Entiendo que asp.net core tiene un nuevo sistema de configuración que es bastante flexible y eso es genial. Pero hay cosas que me gustan del sistema de configuración basado en web.config de .net 4.x. Por ejemplo, uno puede poner comentarios en el archivo web.config ya que es un archivo xml. Y para mí, vale la pena seguir con xml en lugar de ir con el nuevo y brillante enfoque de json. [ Actualización: ahora entiendo que el enfoque json también admite comentarios en el archivo.]
Por lo tanto, si tengo un Proyecto Web Asp.Net Core que se enfoca en el marco completo, parece que debería poder usar el enfoque basado en web.configur System.Configuration.ConfigurationManager.AppSettings[key]
para obtener una configuración.
Pero cuando lo intento, el valor siempre vuelve a ser nulo (al menos con IIS Express utilizando VS2015).
Debería funcionar bien? ¿Alguna idea sobre lo que podría estar mirando en exceso?
Web.config
<configuration>
<appSettings>
<add key="SomeSetting" value="true"/>
</appSettings>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile="./logs/stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
Código para acceder a la configuración:
string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
throw new Exception("The required configuration key " + key + " is missing. ");
ACTUALIZAR
Después de más investigaciones, ahora entiendo por qué no funciona, pero todavía no he encontrado una manera de solucionarlo. La causa raíz parece ser que el ConfigurationManager está buscando la información de configuración en un archivo diferente y no en el web.config.
Esto se puede ver mirando la propiedad AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
. En mi caso, en lugar de señalar la website_folder/web.config
en su lugar, apunta a la carpeta web website_folder/bin/Debug/net461/win7-x64/wwwGiftOasisResponsive.exe.Config
donde website_folder/bin/Debug/net461/win7-x64/wwwGiftOasisResponsive.exe.Config
es la ruta a la carpeta que contiene mi sitio web.
La documentación y la inteligencia dicen que AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
es una propiedad configurable, pero cuando lo intento, encuentro que la configuración no cambia su valor. Muy raro.
Así que ahora que veo cuál es el problema, parece que no puedo encontrar una manera de solucionarlo.
Encontré la solución. La clave para averiguarlo fue darse cuenta de que la propiedad AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
no apuntaba al archivo web.config sino al archivo exe.config para el ejecutable que ejecuta el sitio web. Recuerde, bajo .net core, el sitio web se ejecuta en su propio proceso y tiene su propio exe.
Por lo tanto, el modelo de configuración que utiliza .Net 4.x con ConfigurationManager es más parecido a una aplicación de escritorio que a una aplicación web 4.x. Con eso quiero decir que está mirando el exe.config no el web.config.
Luego me di cuenta de que Asp.Net Core Web Project (que usa el marco completo) contiene un archivo app.config como lo haría una aplicación de escritorio. Y resulta que si coloca sus ajustes de configuración de la aplicación .net 4.x en ese archivo, se colocarán en el archivo exe.config cuando se genere el archivo ejecutable, ya sea para la depuración o para el lanzamiento. Justo exactamente como funciona con una aplicación de formularios ganadores, por ejemplo.
Por lo tanto, la forma de utilizar el ConfigurationManager en una aplicación web central de asp.net que apunta al marco completo es colocar la configuración de la aplicación en el archivo app.config en lugar del archivo web.config. El ConfigurationManager no encontrará ningún problema.
Si bien esto explica mucho, todavía no ofrece esa capacidad para poner esas configuraciones en la web.config y acceder a ellas a través del ConfigurationManager. Pero estoy empezando a creer que eso no es posible en una aplicación web central de asp.net, incluso si se dirige a todo el marco.
Me encontré con este problema cuando comencé a publicar mi aplicación asp.net core 1.1 en IIS.
Se generaría un archivo web.config en el IIS que se sobrescribió en la publicación. Para habilitar la autenticación de Windows tuve que agregar un web.config manualmente a mi proyecto. Éste se publica correctamente en IIS:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments="./yourproject.dll" stdoutLogEnabled="false" stdoutLogFile="./logs/stdout" />
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
</configuration>
También me encontré con este problema. Después de algunas investigaciones y lecturas, es como si pudiera agregar web.config manualmente pero esto es para proporcionar configuraciones para IIS (por ejemplo, autenticación, ...).
Para los ajustes o las configuraciones personalizadas, debe trabajar con el archivo appsettings.json y la nueva Configuración en .Net Core.