Класс запуска OWIN выполняется вместе с методом WebAPIConfig.Register - PullRequest
0 голосов
/ 06 октября 2018

Я использую Microsoft.Owin.Hosting в своем проекте тестирования интеграции для самостоятельного размещения веб-API для тестирования сквозной функциональности.

[TestMethod]
public void GetLoanApplications()
{
    using (WebApp.Start<Startup>(url: url))
    {
        using (var client = new HttpClient())
        {
            // Create httpclient and send request-and-response-metadata-in-aspnet-web-api
        }
    }
}

Я могу самостоятельно размещать вебAPI и может вызвать действие контроллера.Оуэну требуется некоторая конфигурация класса Startup, которая выглядит следующим образом:

[assembly: OwinStartup(typeof(MyService.App_Start.Startup))]
namespace MyService.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            app.UseWebApi(config);
        }
    }
}

Вот мой метод настройки Web API выглядит следующим образом:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );            
    }
}

Проблема

  • Когда я запускаю свое основное приложение (не тестовый проект), запускаются оба метода запуска Owin и веб-API.
  • Скажем, есть ли у меня какие-либо службы или фильтрынастроенный, он будет вызван дважды.
  • То, что я думал, если я запускаю тестовый проект, он должен вызывать только файл запуска owin (, который он делает прямо сейчас ), и когда я отлаживаюмое основное приложение должно вызывать только метод регистра конфигурации web API.

Есть идеи, как это должно работать, или я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Во-первых, системе потребуется способ дифференциации между средами.

<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>
0 голосов
/ 08 октября 2018

Вам нужно выбрать между init your web api из OWIN конвейера или старым методом в Application_Start, см. жизненный цикл приложения .

Если вы оставите Application_Start и OwinSartup, то ваш веб-API будет инициализирован дважды

...