所有对ASP.NET Web API的请求都返回404错误
所有对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错误。如果我在浏览器中(在服务器上打开的IE 9)只输入一个Web API的URL来运行GET请求,我会得到一个404页面。如果我从一个Web API客户端应用程序发出POST请求,我也会得到一个404错误和以下消息:
找不到与请求URI匹配的HTTP资源。
我还创建了一个带有MVC 4和Web API的测试网站,并将其部署在同一台服务器上,Web API可以正常工作。Web API和MVC的程序集在这两个项目中具有相同的版本号。
此外,我还添加了Web API路由调试器到应用程序中。如果我使用一个有效的路由,如http://myserver/api/order/12
,我会得到以下结果:
对我来说,这意味着正确的路由模板Api/{Controller}/{Id}
已经找到并正确解析为控制器Order
和Id=12
。控制器(派生自ApiController
)存在于包含所有MVC控制器的Web程序集中。
然而,我不知道状态000
可能意味着什么,也不知道为什么没有显示“路由选择”部分(即使程序集不包含任何ApiController
,请参见上面链接页面上的截图)。看起来就像没有找到ApiController
,甚至没有搜索或搜索失败。
IIS日志文件没有显示有用的信息。更改各种应用程序池设置并在测试和实际应用程序中使用相同的应用程序池没有帮助。
我目前正在逐步从应用程序中删除“功能”,配置设置,第三方程序集等,以使其最终缩小到测试应用程序的大小,并希望在某个时候它开始工作。
有人知道可能是什么问题吗?任何有关找到原因的调试或日志记录想法都非常受欢迎。
编辑
由于Darrel Miller在下面的评论中给出的提示,我已经集成了ASP.NET Web Api的跟踪功能。
对于(GET)请求URL http://myserver/api/order/12
,我得到以下结果:
- 在开发环境中,成功(简略形式):
消息:
http://localhost:50020/api/order/12
;类别:System.Web.Http.Request控制器选择和实例化...
运算符:DefaultHttpControllerSelector;操作:SelectController;消息:Route="controller:order,id:12";类别:System.Web.Http.Controllers
运算符:DefaultHttpControllerSelector;操作:SelectController;消息:Order;类别:System.Web.Http.Controllers
运算符:HttpControllerDescriptor;操作:CreateController;消息:;类别:System.Web.Http.Controllers
运算符:DefaultHttpControllerActivator;操作:Create;消息:;类别:System.Web.Http.Controllers
运算符:DefaultHttpControllerActivator;操作:Create;消息:MyApplication.ApiControllers.OrderController;类别:System.Web.Http.Controllers
接下来是动作选择、参数绑定和动作调用...
内容协商和结果格式化...
运算符:DefaultContentNegotiator;操作:Negotiate;消息:类型 = "String" ...
更多
释放控制器...
运算符:OrderController;操作:Dispose;消息:;类别:System.Web.Http.Controllers
- 在生产环境中,不成功(简略形式):
消息:
http://myserver/api/order/12
;类别:System.Web.Http.Request运算符:DefaultHttpControllerSelector;操作:SelectController;消息:Route="controller:order,id:12";类别:System.Web.Http.Controllers
整个控制器激活、动作选择、参数绑定和动作调用部分都缺失,紧接着是内容协商和格式化错误消息:
运算符:DefaultContentNegotiator;操作:Negotiate;消息:类型 = "HttpError" ... 更多
在这个问题中,出现404错误的原因是缺少部署在虚拟目录根目录下的Global.asax文件。解决方法是将Global.asax文件打包并部署到虚拟目录的根目录下。
上面的讨论中提到了使用WiX安装程序创建了一个API项目,并将其安装在一个测试虚拟机上。然后,在请求API应该服务的URI时,出现了404错误。最后发现,问题的原因是在部署中漏掉了Global.asax文件。
另外,还提到了一个解决方法,即在发布时勾选“Pre-compile before....”。这个方法可以使得发布的API项目在部署后能够像本地服务器一样工作。
总结一下,解决这个问题的方法是确保在部署API项目时,将Global.asax文件打包并部署到虚拟目录的根目录下。如果使用WiX安装程序进行部署,还可以勾选“Pre-compile before....”选项来解决问题。