C# 在现有ASP.NET MVC 5项目中使用WebAPI 2.2
我在现有的MVC5项目中使用WebAPI 2.2和属性路由。我打算将整个网站迁移到WebAPI,但这需要一些时间。我让一切正常,但我担心我可能做错了什么 如果我简单地删除C# 在现有ASP.NET MVC 5项目中使用WebAPI 2.2,c#,asp.net-web-api,asp.net-mvc-5,asp.net-web-api2,attributerouting,C#,Asp.net Web Api,Asp.net Mvc 5,Asp.net Web Api2,Attributerouting,我在现有的MVC5项目中使用WebAPI 2.2和属性路由。我打算将整个网站迁移到WebAPI,但这需要一些时间。我让一切正常,但我担心我可能做错了什么 如果我简单地删除WebApiConfig.Register()中通常提供的HttpConfiguration参数,并在WebApiConfig.Register()方法中简单地调用GlobalConfiguration.configuration(x=>x.maphttpAttribute()),那么WebAPI端点将以所需的结果响应 这就是
WebApiConfig.Register()
中通常提供的HttpConfiguration参数,并在WebApiConfig.Register()
方法中简单地调用GlobalConfiguration.configuration(x=>x.maphttpAttribute())
,那么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();
}
}
实际上与执行以下操作相同:
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.maphttpAttribute路由())
基本上与GlobalConfiguration.configuration(WebApiConfig.Register)
做的事情相同
从逻辑上讲,这些应该产生相同的结果。以下是System.Web.Http命名空间中用于全局配置的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
}
//
///为ASP.NET应用程序提供全局配置。
///
公共静态类全局配置
{
私有静态惰性配置=CreateConfiguration();
///…为简洁起见,代码被排除在外
///
///获取全局值。
///
公共静态HttpConfiguration
{
获取{return\u configuration.Value;}
}
///
///执行的配置,并确保
///初始化。
///
///将执行配置的回调。
公共静态无效配置(操作配置回调)
{
if(configurationCallback==null)
{
抛出新ArgumentNullException(“configurationCallback”);
}
configurationCallback.Invoke(配置);
Configuration.ensureIninitialized();
}
私有静态惰性CreateConfiguration()
{
返回新的延迟(()=>
{
HttpConfiguration配置=新的HttpConfiguration(新的HostedHttpRouteCollection(RouteTable.Routes));
ServicesContainerServices=config.services;
Assert(services!=null);
替换(typeof(iasembliesresolver),新的webhostassembliesrolver());
替换(typeof(IHttpControllerTypeResolver),新的WebHostHttpControllerTypeResolver());
替换(typeof(IHostBufferPolicySelector),新的WebHostBufferPolicySelector());
服务。替换(类型为(IEExceptionHandler),
新的WebHostExceptionHandler(services.GetExceptionHandler());
返回配置;
});
}
///…为简洁起见,代码被排除在外
}