Во-первых, системе потребуется способ дифференциации между средами.
<appSettings>
<add key="APP_ENVIRONMENT" value="Development" />
<!-- ... -->
</appSettings>
Поскольку при запуске в производственном процессе вызываются методы запуска Owin и конфигурации web api, тогда OWIN уже настроен как первый.класс гражданин в проекте.
Я предлагаю переместить код из Application_Start
в режим запуска
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
, чтобы избежать повторения кода.Одна и та же конфигурация будет применяться для любой среды и всех в одном и том же месте, если должны быть реализованы дополнительные конфигурации (т. Е. Разработка, тестирование, постановка, Procustion и т. Д.)
ТестПроект app.config
будет включать в себя текущую настройку среды
<appSettings>
<add key="APP_ENVIRONMENT" value="Test" />
<!-- ... -->
</appSettings>
и будет вызывать начальную конфигурацию для самостоятельного размещения, в противном случае он вернется к рабочим настройкам по умолчанию, но также будет настроен в web.config
<appSettings>
<add key="APP_ENVIRONMENT" value="Production" />
<!-- ... -->
</appSettings>