Использование WebAPI 2.2 внутри существующего проекта ASP.NET MVC 5
Я использую WebAPI 2.2 с маршрутизацией атрибутов внутри существующего проекта MVC 5. Я намерен перенести весь веб-сайт в WebAPI, но это займет некоторое время. У меня все работает, но я обеспокоен, что могу делать что-то не так.
Если я просто удаляю аргумент HttpConfiguration, обычно предоставляемый в WebApiConfig.Register()
и просто позвони GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes())
в пределах WebApiConfig.Register()
Метод - конечные точки WebAPI отвечают желаемыми результатами.
Итак, вот что я получаю в итоге:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
class WebApiConfig
{
public static void Register()
{
GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());
}
}
Что-то не так с этим подходом?
1 ответ
Таким образом, оказывается, что есть просто два способа исправить проблему с конфигурацией, которая возникает, когда WebAPI 2.2 добавляется в существующий проект. Я делал ОБА исправления, которые стали мне понятны, когда я прочитал код.
Следующие:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
class WebApiConfig
{
public static void Register()
{
GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());
}
}
Это практически то же самое, что делать следующее:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//WebApiConfig.Register();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.MapHttpAttributeRoutes();
}
}
Кажется, я просто переживал психическое расстройство:)
Должно было быть очевидно, что GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes())
в основном делает то же самое, что и GlobalConfiguration.Configure(WebApiConfig.Register)
,
Логически следует, что они должны давать тот же результат. Вот код Microsoft для GlobalConfiguration в пространстве имен System.Web.Http:
/// <summary>
/// Provides a global <see cref="T:System.Web.Http.HttpConfiguration"/> for ASP.NET applications.
/// </summary>
public static class GlobalConfiguration
{
private static Lazy<HttpConfiguration> _configuration = CreateConfiguration();
///... code excluded for brevity
/// <summary>
/// Gets the global <see cref="T:System.Web.Http.HttpConfiguration"/>.
/// </summary>
public static HttpConfiguration Configuration
{
get { return _configuration.Value; }
}
/// <summary>
/// Performs configuration for <see cref="GlobalConfiguration.Configuration"/> and ensures that it is
/// initialized.
/// </summary>
/// <param name="configurationCallback">The callback that will perform the configuration.</param>
public static void Configure(Action<HttpConfiguration> configurationCallback)
{
if (configurationCallback == null)
{
throw new ArgumentNullException("configurationCallback");
}
configurationCallback.Invoke(Configuration);
Configuration.EnsureInitialized();
}
private static Lazy<HttpConfiguration> CreateConfiguration()
{
return new Lazy<HttpConfiguration>(() =>
{
HttpConfiguration config = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
ServicesContainer services = config.Services;
Contract.Assert(services != null);
services.Replace(typeof(IAssembliesResolver), new WebHostAssembliesResolver());
services.Replace(typeof(IHttpControllerTypeResolver), new WebHostHttpControllerTypeResolver());
services.Replace(typeof(IHostBufferPolicySelector), new WebHostBufferPolicySelector());
services.Replace(typeof(IExceptionHandler),
new WebHostExceptionHandler(services.GetExceptionHandler()));
return config;
});
}
///... code excluded for brevity
}