对ASP.NET Web API的所有请求都返回404错误
我有一个包含web API的ASP.NET MVC 4网站。该网站使用Visual Studio 2012和.NET 4.5在Windows 8上开发和测试,IIS Express作为web服务器在这种开发环境中,一切正常。 现在它部署在带有IIS 7.5的Windows 2008 R2(SP1)服务器上。NET 4.0和4.5已安装。应用程序池以集成管道模式运行.NET 4.0 在这种生产环境中,MVC网站可以工作,而web API不能。对于每个请求,无论GET或POST我都会收到404错误。如果我只是在浏览器中输入一个Web API Url(即在服务器上本地打开的9)来运行GET请求,我会得到一个404页面。如果我从Web API客户端应用程序发出POST请求,我也会收到一个404和消息: 未找到与请求URI匹配的HTTP资源 我已经用MVC 4和Web API创建了一个测试网站,并将其部署在同一台服务器上,Web API工作。Web API和MVC程序集在两个项目中的版本号相同 此外,我还向应用程序中添加了。如果我使用有效的路由,如对ASP.NET Web API的所有请求都返回404错误,asp.net,.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,我有一个包含web API的ASP.NET MVC 4网站。该网站使用Visual Studio 2012和.NET 4.5在Windows 8上开发和测试,IIS Express作为web服务器在这种开发环境中,一切正常。 现在它部署在带有IIS 7.5的Windows 2008 R2(SP1)服务器上。NET 4.0和4.5已安装。应用程序池以集成管道模式运行.NET 4.0 在这种生产环境中,MVC网站可以工作,而web API不能。对于每个请求,无论GET或POST我都会收到404错误。
http://myserver/api/order/12
我得到以下结果:
对我来说,这意味着找到了正确的路由模板Api/{Controller}/{Id}
,并将其正确解析为控制器Order
和Id=12
。控制器(源自ApiController
)存在于web部件中,所有MVC控制器都位于该部件中
但是,我不知道状态000
可能意味着什么,也不知道为什么没有显示“路线选择”部分(通常情况下,即使部件不包含单个ApiController
,请参见上面链接页面上的屏幕截图)。不知何故,它看起来好像没有找到ApiController
,甚至没有搜索,或者搜索无声地失败
IIS日志文件没有显示任何有用的内容。更改各种应用程序池设置,并使用相同的应用程序池进行测试和实际应用程序都没有帮助
我目前正在从应用程序中删除“功能”、配置设置、第三方程序集等,以便最终将其缩小到测试应用程序的小规模,并希望在某个时候开始工作
有人知道问题可能是什么吗?此外,任何可能找到原因的调试或日志想法都是非常受欢迎的
编辑
感谢Darrel Miller在下面评论中的提示,我已经整合了
对于(GET)请求URLhttp://myserver/api/order/12
我得到以下信息:
- 在开发环境中,成功(简称):
http://localhost:50020/api/order/12
;类别:
System.Web.Http.Request
控制器选择和实例化…
操作员:默认HttpControllerSelector;操作:选择控制器;
消息:Route=“控制器:订单,id:12”;类别:
System.Web.Http.Controllers
操作员:默认HttpControllerSelector;操作:选择控制器;
信息:订单;类别:System.Web.Http.Controller
操作员:HttpControllerDescriptor;操作:CreateController;
信息:;类别:System.Web.Http.Controller
操作员:DefaultHttpControllerActivator;操作:创建;信息:
; 类别:System.Web.Http.Controller
操作员:DefaultHttpControllerActivator;操作:创建;信息:
MyApplication.ApicController.OrderController;类别:
System.Web.Http.Controllers
操作选择、参数绑定和操作调用如下…
结果的内容协商和格式…
操作员:谈判代表;操作:谈判;消息:Typ=“String”。。。
更多
处理控制器…
操作员:订单控制员;操作:处置;信息:;类别:
System.Web.Http.Controllers
- 在生产环境中,未成功(缩写):
http://myserver/api/order/12
;类别:
System.Web.Http.Request
操作员:默认HttpControllerSelector;操作:选择控制器;
消息:Route=“控制器:订单,id:12”;类别:
System.Web.Http.Controllers
缺少控制器激活、操作选择、参数绑定、操作调用的整个部分,它遵循内容
立即协商并格式化错误消息:
操作员:谈判代表;操作:谈判;信息:
Type=“HttpError”。。。更多
多亏了来自的注释和源代码,我才发现生产服务器上缺少一个程序集(SQL Server Reporting Services的ReportViewer 11程序集
)
尽管此程序集中没有ApiController
,但似乎会导致程序集中的控制器(在本例中为我的Web项目的程序集中)找不到引用缺失程序集的控制器
显然,这种行为与源代码中的这段代码有关:
列表结果=新列表();
//检查应用程序引用的所有程序集
//并搜索与谓词匹配的类型
I收集
编辑
我已经发出了对CodePlex的改进请求:
编辑2(2013年8月11日)
WebAPI v5.0 RC解决了这个问题。有关详细信息,请参见上面指向workitem及其评论部分的链接。在这个答案中提供了大量资源,但是,我得到了404,这是一个非常愚蠢的原因:
我为我的API创建了一个WiX安装程序
List<Type> result = new List<Type>();
// Go through all assemblies referenced by the application
// and search for types matching a predicate
ICollection<Assembly> assemblies = assembliesResolver.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
Type[] exportedTypes = null;
if (assembly == null || assembly.IsDynamic)
{
// can't call GetExportedTypes on a dynamic assembly
continue;
}
try
{
exportedTypes = assembly.GetExportedTypes();
}
catch (ReflectionTypeLoadException ex)
{
exportedTypes = ex.Types;
}
catch
{
// We deliberately ignore all exceptions when building the cache. If
// a controller type is not found then we will respond later with a 404.
// However, until then we don't know whether an exception at all will
// have an impact on finding a controller.
continue;
}
if (exportedTypes != null)
{
result.AddRange(exportedTypes.Where(x => IsControllerTypePredicate(x)));
}
}
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0"
type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>