我在现有MVC 5项目中使用带有属性路由的WebAPI 2.2。我打算将整个网站迁移到WebAPI,但这需要一些时间。我一切正常,但我担心自己可能做错了什么。
该SO帖子似乎建议我应该在Global.asax.cs文件中调用GlobalConfiguration.Configure(WebApiConfig.Register)。
如果我只是删除通常在中提供的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());
}
}
这种方法有什么问题吗?
因此,事实证明,只有两种方法可以解决将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)
。
从逻辑上讲,这些应该产生相同的结果。这是System.Web.Http命名空间中GlobalConfiguration的Microsoft代码:
/// <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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句