在 IIS (Host.SystemWeb) 下 运行 时,如何设置 OWIN 键,例如 host.AppMode?

How do I set OWIN keys like host.AppMode when running under IIS (Host.SystemWeb)?

在我正在重构的应用程序的 OWIN 管道中,我发现了以下代码片段:

private bool IsDevelopment(IAppBuilder app)
{
    const string appModeKey = "host.AppMode";
    if (app.Properties.ContainsKey(appModeKey))
    {
        var appMode = app.Properties[appModeKey] as string;
        if (!string.IsNullOrEmpty(appMode))
        {
            return appMode.Equals("development", StringComparison.InvariantCultureIgnoreCase);
        }
    }

    return false;
}

然后使用此方法的结果来做出决定,例如。管道中包含哪些组件:

if (IsDevelopment(app))
{
    app.Use<DevelopmentAuthMiddleware>();
}
else
{
    app.Use<ProductionAuthMiddleware>();
}

现在,在我正在设置的新测试环境中,我想 - 现在,但不是永远 - 使用开发配置。

有没有一种方法可以在不更改决策代码的情况下实现?换句话说,如何从应用程序代码外部将 app.Properties["host.AppMode"] 设置为 "development"

(Web.config 中的 AppSettings 或类似的东西可以工作,如果我能弄清楚如何;我可以在部署时更改它们,因为它们因环境而异。)

如果您使用 "old" Asp.Net,那么最简单的方法是使用 ConfigurationManager 从 web.config 的 <appSettings> 部分读取密钥,即:

private bool IsDevelopment(IAppBuilder app) {
    return ConfigurationManager.AppSettings["isDevelopment"] == "true";
}

在web.config中:

<appSettings>  
  <add key="isDevelopment" value="true" />       
</appSettings>

Asp.Net 核心默认使用Env variables来实现类似的事情。

检查 Host.SystemWebsource code 有一部分代码直接将 host.AppMode 设置为 developer 根据web.config中的system.web/compilation是否设置为调试

CompilationSection compilationSection = (CompilationSection)System.Configuration.ConfigurationManager.GetSection(@"system.web/compilation");
bool isDebugEnabled = compilationSection.Debug;
if (isDebugEnabled)
{
    builder.Properties[Constants.HostAppModeKey] = Constants.AppModeDevelopment;
}

在整个源代码中,没有其他直接访问 属性 设置它的地方。

所以我的建议是更新 web.config 文件

<system.web>
    <compilation debug="true" />

应该允许从应用程序代码外部将 app.Properties["host.AppMode"] 设置为 "development"