首先,系统需要一种区分环境的方法。
<appSettings>
<add key="APP_ENVIRONMENT" value="Development" />
<!-- ... -->
</appSettings>
由于在生产环境中运行时,Owin 启动和 Web api 配置方法都会被调用,因此 OWIN 已被配置为项目中的一等公民。
我建议将代码从Application_Start
进入owin启动
public class WebApiApplication : System.Web.HttpApplication {
protected void Application_Start() {
//REMOVE THIS AND LET OWIN STARTUP HANDLE SETUP
//GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
以便根据配置的环境仅调用一次。
[assembly: OwinStartup(typeof(MyService.App_Start.Startup))]
namespace MyService.App_Start {
public class Startup {
const string EnvironmentKey = "APP_ENVIRONMENT";
const string PRODUCTION = "Production";
const string TEST = "Test";
public void Configuration(IAppBuilder app) {
string ENVIRONMENT = ConfigurationManager.AppSettings[EnvironmentKey]
?? Production;
if(ENVIRONMENT == TEST) {
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
} else {
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
}
注意重用WebApiConfig.Register
以避免重复代码。如果要实施其他配置,则相同的配置将应用于任一环境并且全部在同一位置(即开发、测试、分阶段、生产...等)
测试项目app.config
将包括当前环境的设置
<appSettings>
<add key="APP_ENVIRONMENT" value="Test" />
<!-- ... -->
</appSettings>
并调用自托管的启动配置,否则它将默认返回生产设置,但也会在web.config
<appSettings>
<add key="APP_ENVIRONMENT" value="Production" />
<!-- ... -->
</appSettings>