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

Скажем, например, в совершенно новом приложении ASP.NET MVC 5, созданном из шаблона MVC w/Individual Accounts, если я удалю класс 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, я не делаю инъекции зависимостей и другую конфигурацию в двух разных классах которые, похоже, связаны с запуском и конфигурацией.

Ответ 1

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

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

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

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

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

Ответ 2

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

  • File -> New -> Project
  • В диалоговом окне Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  • В решении щелкните правой кнопкой мыши, добавьте 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
    
  • Установите следующие пакеты:

    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 с методом настройки:

[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, который вы после), и вам должно быть хорошо идти