Нужен ли вообще файл Global.asax.cs, если я использую класс OWIN Startup.cs и перенесу туда всю конфигурацию?

197

Скажем, например, в совершенно новом приложении ASP.NET MVC 5, созданном из MVC с шаблоном «Индивидуальные учетные записи», если я удалю Global.asax.csкласс и перенесу его код конфигурации в Startup.cs Configuration()метод следующим образом, каковы недостатки?

public partial class Startup
{
     public void Configuration(IAppBuilder app)
     {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        ConfigureAuth(app);
    }
}

Плюсы для меня - то, что при обновлении приложений ASP.NET 4 до ASP.NET 5 и использовании частей, которые теперь должны быть настроены в классе Startup.cs, я не делаю внедрение зависимостей и другие настройки в двух разных классах, которые кажутся связанными для запуска и конфигурации.

iliketocode
источник
AreaRegistration.RegisterAllAreas();Вызвала ошибку для меня, так как этот метод не может быть использован во время запуска, как это, только в Application_Start. Однако мое приложение представляет собой API, и этот метод, по-видимому, полезен только для приложений MVC: stackoverflow.com/questions/18404637/…
Харви,

Ответы:

171

Startup.Configuration вызывается чуть позже, чем Application_Start, но я не думаю, что в большинстве случаев разница будет иметь большое значение.

Я считаю, что основные причины, по которым мы сохранили другой код в Global.asax:

  1. Соответствие с предыдущими версиями MVC. (Вот где все ожидают найти этот код.)
  2. Возможность добавлять другие обработчики событий. В Global.asax вы можете обрабатывать другие методы, такие как Session_Start и Application_Error.
  3. Корректность в различных сценариях аутентификации. Метод Startup.Configuration вызывается только в том случае, если в каталоге bin находится файл Microsoft.Owin.Host.SystemWeb.dll. Если вы удалите эту DLL-библиотеку, она автоматически перестанет вызывать Startup.Configuration, что может быть трудно понять.

Я думаю, что третья причина является самой важной, мы не использовали этот подход по умолчанию, поскольку некоторые сценарии не включают в себя наличие этой DLL, и приятно иметь возможность изменять подходы аутентификации, не делая недействительным местоположение, в котором не связан код (например, регистрация маршрута) размещена.

Но если ни одна из этих причин не применима в вашем сценарии, я думаю, что вы будете в порядке, используя этот подход.

dmatson
источник
19
Еще одним преимуществом использования Startup.Configuration () является то, что вы можете легко разместить свой сайт, используя собственный хост owin, используя всего одну строку кода: WebApp.Start <Startup> (" localhost: 3001 /" ) asp.net/web-api/ обзор / hosting-aspnet-web-api /… Это особенно удобно для написания интеграционных тестов
Борис Липшиц
16
Чтобы предотвратить побочный эффект «тихая остановка вызова Startup.Configuration», вы можете добавить ключ app.ettings web.config «owin: appStartup», который явно указывает тип, который будет использоваться для запуска OWIN, вместо того, чтобы полагаться на соглашение об именах. уважать. Это также удобно для поддержки различных конфигураций для разных сред (dev / test / prod)
Тиаго Сильва
2
+1 за # 3. Я хотел начать работу с веб-API, поэтому создал пустой шаблон веб-сайта ASP.NET и добавил WebApi.Owinпакет nuget. Я ошибочно ожидал, что зависимость будет включать все для запуска на IIS. Понятия не имею, почему я думал, что так как я хотел, чтобы стартап Owin разобщил зависимость IIS в первую очередь.
Pluc
@dmatson С вашим последним утверждением вы в основном подразумеваете, что класс Startup предназначен только для аутентификации?
Сэм
@Sam, запуск не используется для других конфигураций, таких как фильтры и маршруты, как показывает вопрос.
Дамсон
33

Для тех, кто ищет полные шаги: Если вы хотите создать веб-API на базе OWIN, размещенный на IIS, эти шаги должны помочь вам:

  1. File -> New -> Project
  2. В диалоге Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. В решении щелкните правой кнопкой мыши и добавьте Project -> Web -> ASP.NET Web Application(нацеливание на .NET 4.6).

    3.1 Теперь в шаблонах ASP.NET 4.5 выберите Пустой в качестве шаблона

    3.2 Это создает пустое решение с двумя пакетами nuget:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
    
  4. Установите следующие пакеты:

    Install-Package Microsoft.AspNet.WebApi.WebHost -Version 5.2.3
    Install-Package Microsoft.AspNet.WebApi -Version 5.2.3
    Install-Package WebApiContrib.Formatting.Razor 2.3.0.0
    

Для OWIN:

Install-Package Microsoft.Owin.Host.SystemWeb 
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost    

Затем добавьте Startup.cs с помощью метода Configuration:

[assembly:OwinStartup(typeof(namespace.Startup))]
public class Startup
    {
        /// <summary> Configurations the specified application. </summary>
        /// <param name="app">The application.</param>
        public static void Configuration(IAppBuilder app)
        {
            var httpConfiguration = CreateHttpConfiguration();

            app
                .UseWebApi(httpConfiguration);
        }

        /// <summary> Creates the HTTP configuration. </summary>
        /// <returns> An <see cref="HttpConfiguration"/> to bootstrap the hosted API </returns>
        public static HttpConfiguration CreateHttpConfiguration()
        {
            var httpConfiguration = new HttpConfiguration();
            httpConfiguration.MapHttpAttributeRoutes();

            return httpConfiguration;
        }
}

Теперь добавьте класс, который наследуется ApiController, аннотируйте его RoutePrefixатрибутом, а метод действия - Route + HttpGet/PutPost(представляющий глагол Http, который вам нужен), и вам будет хорошо

Судханшу Мишра
источник
1
Спасибо @dotnetguy !!! Я пытался полностью избавиться от Global.asax, но не смог. Наконец, следуя вашим шагам, это сработало для меня. В моем случае отсутствующей частью была ссылка на Install-Package Microsoft.AspNet.WebApi.OwinSelfHostПосле того, как я добавил это в свой API, я смог удалить global.asax.
ярд
2
@yyardim Я думаю, что OwinSelfHost не имеет ничего общего с файлом global.asax, он только дает вам возможность разместить ваше приложение вне iis, например, в службе Windows
Александр Дерк
@dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0показывает ошибку не найден в установочном пакете. Got установка этого пакета работы с Install-Package WebApiContrib.Formatting.Razor 2.3.0, так что без last.0
Dairo
1
@dotnetguy Эта [assembly:OwinStartup(typeof(namespace.Startup))]часть должна находиться над частью пространства имен, в противном случае выдается следующая ошибкаAssembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo
16

Это мое понимание того, как развивался запуск / хостинг веб-приложения, так как все довольно запутанно. Небольшое резюме:

1. Классический ASP.NET: пишите только код приложения для запуска на последнем этапе обязательного конвейера IIS

2. ASP.NET с OWIN: настройте веб-сервер .NET и напишите код своего приложения. Больше не связан напрямую с IIS, поэтому вам больше не нужно его использовать.

3. Ядро ASP.NET: настройте хост и веб-сервер для использования и написания кода приложения. Больше не нужно использовать веб-сервер .NET, если вы ориентируетесь на .NET Core вместо полной .NET Framework.


Теперь я немного подробнее расскажу о том, как это работает и какие классы используются для запуска приложения:

Классический ASP.NET

Классические приложения ASP.NET имеют Global.asaxфайл в качестве точки входа. Эти приложения могут быть запущены только в IIS, и ваш код выполняется в конце конвейера IIS (поэтому IIS отвечает за CORS, аутентификацию ... еще до того, как ваш код запустится). Начиная с IIS 7 вы можете запускать свое приложение в интегрированном режиме, который интегрирует среду выполнения ASP.NET в IIS. Это позволяет вашему коду настраивать функции, которые раньше были недоступны (или только в самом IIS), такие как перезапись URL в Application_Startслучае вашего Global.asaxфайла или использование нового <system.webserver>раздела в вашем web.configфайле.

ASP.NET с OWIN

Прежде всего, OWIN - это не библиотека, а спецификация того, как веб-серверы .NET (например, IIS) взаимодействуют с веб-приложениями. Сами Microsoft имеют реализацию OWIN под названием проект Katana (распространяется через несколько различных пакетов NuGet). Эта реализация предоставляет IAppBuilderинтерфейс, с которым вы сталкиваетесь в Startupклассе, и некоторые промежуточные компоненты OWIN (OMC), предоставляемые Microsoft. С помощьюIAppBuilderвы в основном составляете промежуточное ПО в режиме «подключи и работай», чтобы создать конвейер для веб-сервера (в дополнение к только конвейеру ASP.NET в IIS7 +, как указано выше), а не привязаны к конвейеру IIS (но теперь вы используете компонент промежуточного программного обеспечения для CORS, компонент промежуточного программного обеспечения для аутентификации ...). По этой причине ваше приложение больше не связано с IIS, и вы можете запустить его на любом веб-сервере .NET, например:

  • Пакет OwinHost можно использовать для самостоятельного размещения вашего приложения на веб-сервере Katana.
  • Пакет Microsoft.Owin.Host.SystemWeb используется для размещения вашего приложения OWIN в IIS7 + в интегрированном режиме путем внутренней подписки промежуточного программного обеспечения на правильные события времени жизни.

То, что делает все настолько запутанным, заключается в том, что Global.asaxон по-прежнему поддерживается вместе с Startupклассом OWIN , в то время как оба они могут делать схожие вещи. Например, вы можете внедрить CORS Global.asaxи аутентификацию с помощью промежуточного программного обеспечения OWIN, что может сбить вас с толку.

Мое эмпирическое правило заключается в том, чтобы полностью удалить Global.asaxфайл, чтобы использовать его Startupвсякий раз, когда мне нужно добавить OWIN.

ASP.NET Core

ASP.NET Core - это следующая эволюция, и теперь вы можете использовать как .NET Core, так и полную .NET Framework. Когда вы ориентируетесь на .NET Core, вы можете запускать свое приложение на любом хосте, который поддерживает .NET Standard. Это означает, что вы больше не ограничены веб-сервером .NET (как в предыдущем пункте), но можете разместить свое приложение в контейнерах Docker, веб-сервере Linux, IIS ...

Точкой входа для веб-приложения ASP.NET Core является Program.csфайл. Там вы настраиваете свой хост и снова указываете свой Startupкласс, где вы настраиваете свой конвейер. Использование OWIN (с помощью IAppBuilder.UseOwinметода расширения) не является обязательным, но полностью поддерживается .

Александр Дерк
источник