将Autofac配置为与现有应用程序一起使用ASP.NET MVC和ASP.NET Web Api。
将Autofac配置为与现有应用程序一起使用ASP.NET MVC和ASP.NET Web Api。
我们有一个现有的应用程序,已经配置为使用AutoFac与ASP.Net MVC:
1)所有的控制器、动作信息和路由都已经使用AutoFac手动注册。
2)控制器是通过IControllerFactory的CreateController()方法的实现来解析的(AutoFacControllerFactory)。
3)我在现有的应用程序中添加了一个新的API控制器。
4)在任何传统的ASP.Net路由之前,Web API路由已经被添加如下:
GlobalConfiguration.Configuration.Routes.MapHttpRoute("GetNetworkFeatures", "secure/banking/administration/GetNetworkFeatures/Get", new { controller = "GetNetworkFeatures" });
5)在containerBuilder.Build()之前,新的API控制器也已经使用AutoFac进行注册,如下所示:
foreach (var module in modules) { builder.RegisterApiControllers(module); } container = containerBuilder.Build(); GetNetworkFeaturesController在上述模块之一中加载
6)两个依赖解析器都已经注册如下:
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
7).Net版本是4.5.2,我们使用的ASP.Net MVC版本是3,AutoFac版本是2.6.3.862,AutoFac.Integration.MVC版本是2.6.3.862,AutoFac.Integration.WebApi版本是
2.6.3.863,Newtonsoft.Json版本是11.0.0.0,IIS服务器版本是6.1在Windows Server 2008上
8)目标是使AutoFac、Asp.net MVC路由和Web API路由在同一个应用程序池中共存,当我尝试Web API端点
http://localhost:7070/secure/banking/administration/GetNetworkFeatures/Get时,它仍然进入AutoFacControllerFactory的CreateController()方法,而不是路由到Web API控制器GetNetworkFeaturesController的Get()方法。
9)我认为这可能与XX有关,所以我将其更改为true,但问题仍然存在。基本上看起来
配置的Web API路由没有被遵循,尽管它没有编译和构建错误,但如果我删除以下默认路由,它就开始抛出HTTP 403错误:
RouteTable.Routes.MapRoute("Default", "{*url}", new { controller = "Unspecified", action = "Unspecified" });
10)参考了以下线程:
https://stackoverflow.com/questions/11484904/is-it-possible-to-configure-autofac-to-work-with-asp-net-mvc-and-asp-net-web-api https://stackoverflow.com/questions/37069666/autofac-with-web-api-controller https://stackoverflow.com/questions/44986001/web-api-route-values-is-empty-on-action-executes-filter https://stackoverflow.com/questions/15556035/all-asp-net-web-api-controllers-return-404 https://www.aspforums.net/Threads/218940/Solved-URL-Routing-not-working-with-Web-API-in-IIS-server-and-ASPNet-MVC/
问题的原因是使用了一个反向代理进行身份验证,并且配置了将任何经过身份验证的请求“~/secure/banking/api/XXX”路由到IIS服务器中的真实端点“api/xxx”。如果在下面的路由模板中去掉“secure/banking”,Web API的路由将立即被遵循:
GlobalConfiguration.Configuration.Routes.MapHttpRoute("GetNetworkFeatures", "secure/banking/administration/GetNetworkFeatures/Get", new { controller = "GetNetworkFeatures" });
解决方法:
1. 删除路由模板中的"secure/banking"部分。
这样,Autofac就可以与现有的ASP.NET MVC和ASP.NET Web API应用程序一起正常工作了。