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