Web Api调用在服务器上返回404

时间:2013-04-04 10:52:25

标签: asp.net-mvc asp.net-mvc-4 iis-7 asp.net-web-api

我知道在这个网站和其他网站上已经多次询问过这个问题,但到目前为止我找不到任何解决方案,所以我在这里。

我在mvc 4项目中设置了一些web api路由。这是一个示例:

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服务器和IIS7.5的本地(Windows 7)安装中运行时没有任何花哨的东西,但在Server 2008 R2上的IIS7中运行时会产生404。

的信息:

  • MVC4已安装在服务器上
  • 该应用程序位于具有集成模式和框架v4的应用程序池中

我尝试了什么:

  • 使用路线足以知道这不是路由问题
  • 设置<modules runAllManagedModulesForAllRequests="true" />(无论如何都是默认设置)
  • 看着this
  • 完成了aspnet_regiis -ir dance
  • 关闭自定义错误,编译debug = false - 如果这些有任何区别。
  • 只有自定义api路由,没有全部捕获。
  • IIS日志只是表示404,正如您所期望的那样;系统事件日志中没有任何内容

api仅使用GETPOST个请求,这些请求都不起作用。可能还值得一提的是,这些调用都是通过ajax进行的。

来自config的

system.websystem.webServerruntime部分:

<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>

任何建议都非常感激。感谢。

更新

我重新实现了我的一个控制器,仅使用HttpResponseMessageHttpRequestMessage

[HttpGet]
public HttpResponseMessage GetAccount(HttpRequestMessage message)
{
    message.CreateResponse(....

并且在本地运行时(在Win7上都是cassini和完整的IIS本地安装)再次按预期工作,但在推送到服务器时失败。

2 个答案:

答案 0 :(得分:1)

更新:我刚刚注意到你说GET方法也没有用,在这种情况下,这个建议可能对你没用。

尝试将方法的签名更改为

[HttpPost]
public HttpResponseMessage SaveAccount(HttpRequestMessage request)
{

}

这将允许您排除Action选择/模型绑定的问题。如果它仍然不匹配,那么我建议你打开跟踪编写器,找出它找不到控制器的原因。 http://nuget.org/packages/Microsoft.AspNet.WebApi.Tracing/

如果它符合上述签名,请查看此博客文章http://www.bizcoder.com/?p=259,以获取有关如何调试序列化问题的进一步建议。

答案 1 :(得分:0)

无法解决此问题。几乎可以肯定的是,在服务器上没有安装或打开一些模糊不清的东西。非常令人沮丧,因为其他Web Apis已经在同一个盒子上工作。

无法再花费更多时间,所以只需使用Service Stack重新实现,这样就可以了。