Web服务器上的API Api调用返回404
我知道这个问题已经在这个站点和其他站点上问了很多次,但是迄今为止我没有看到任何解决方案正在工作,所以我在这里。Web服务器上的API Api调用返回404
我有一些web api路由设置在mvc 4项目中。这里有一个例子:
routes.MapHttpRoute(name: null, routeTemplate: "Client/Accounts/Save", defaults: new { controller = "AccountsApi", action = "SaveAccount" });
对应于下列的控制器和行动:
public class AccountsApiController : ApiController
{
[HttpPost]
public object SaveAccount([FromBody] Account input)
{
.....
在运行时,该工作内置的VS web服务器,并在本地(Windows 7)中安装IIS7的。 5,没有花哨的东西,但在Server 2008 R2上的IIS7中运行时会产生404。
信息:
- MVC4安装在服务器上
- 的应用与集成模式和框架v4中的应用程序池
我已经试过:
- 与路线玩足以知道它不是路由问题
- 有
<modules runAllManagedModulesForAllRequests="true" />
集(是默认反正) - 看着this
- 完成的ASPNET_REGIIS -ir舞蹈
- 自定义错误关闭,编译调试=假的 - 如果这些任何区别。
- 只有自定义API路线,没有捕获所有。
- IIS日志只是表示一个404,如你所料;没有在系统事件日志
API使用仅GET
和POST
请求,两者都没有工作。值得一提的是,这些调用都是通过ajax完成的。从配置
system.web
,system.webServer
,runtime
部分:
<system.web>
<compilation debug="false" targetFramework="4.0" />
<customErrors mode="Off" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
任何建议非常感激。谢谢。
更新
我重新实现了我的一个控制器只使用HttpResponseMessage
和HttpRequestMessage
[HttpGet]
public HttpResponseMessage GetAccount(HttpRequestMessage message)
{
message.CreateResponse(....
,这再次作品在本地运行时预期(包括卡西尼和完整的IIS本地Win7上安装) ,但推送到服务器时失败。
无法解决此问题。几乎可以肯定的是,在服务器上没有安装或打开一些晦涩的东西。非常令人沮丧的是其他Web Apis已经在同一个盒子上工作。
不能再花更多时间在它上面,所以只是使用Service Stack来代替,这只是起作用。
更新:我只注意到你说的GET方法也不起作用,在这种情况下,这个建议可能对你没有用。
试着改变方法的签名
[HttpPost]
public HttpResponseMessage SaveAccount(HttpRequestMessage request)
{
}
这将允许你用行动选择/模型绑定规则出了问题。如果它仍然不匹配,那么我建议你打开跟踪编写器,找出它无法找到控制器的原因。 http://nuget.org/packages/Microsoft.AspNet.WebApi.Tracing/
如果它符合上面的签名,那么看看这篇博客文章http://www.bizcoder.com/?p=259以获取关于如何调试序列化问题的进一步建议。
感谢您的建议Darrel。我重新实现了一个控制器操作(一个GET操作)使用原始的HttpResponseMessage和HttpRequstMessage,并且,再次说明,在本地运行时,它可以完美工作,尽管代码更多,但是当我将其推送到服务器时会发生可怕的炸弹。 。 – 2013-04-05 09:06:55
嘿!你刚刚放弃了吗?我有一个类似于你的问题。所有操作都可以使用,但是那些使用PUT和DELETE方法。我尝试了所有的解决方案。但放弃不是我的选择。 – 2013-06-10 16:17:43
是的,我放弃并重新实现了服务堆栈 - 这是我更熟悉和满意的事情。如果放置和删除不起作用,它可能是防火墙相关的,看看这个:http://*.com/questions/1828790/restful-put-and-delete-and-firewalls – 2013-06-10 16:42:03
不,它没有,即使在本地机器上也能工作。让我疯狂的是,同一个应用程序在IIS Express上运行。我卸载IIS,然后重新安装它,并重新创建Web应用程序,它的工作!也许我的配置搞砸了。谢谢您的回复。 – 2013-06-10 21:13:36