【问题标题】:Web Api calls return 404 on ServerWeb Api 调用在服务器上返回 404
【发布时间】:2013-04-04 10:52:24
【问题描述】:

我知道这个网站和其他网站上已经被问过很多次了,但到目前为止我看到的解决方案都没有,所以我在这里。

我在一个 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 舞蹈
  • 自定义错误关闭,编译 debug=false - 如果这些有什么不同的话。
  • 只有自定义 api 路由,没有包罗万象。
  • IIS 日志只显示 404,正如您所料;系统事件日志中没有任何内容

该 api 仅使用 GETPOST 请求,这两个请求都不起作用。可能还值得一提的是,这些调用都是通过 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>

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

更新

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    尝试将方法的签名更改为

    [HttpPost]
    public HttpResponseMessage SaveAccount(HttpRequestMessage request)
    {
    
    }
    

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

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

    【讨论】:

    • 感谢达雷尔的建议。我重新实现了一个控制器操作(一个 GET 操作)以使用原始 HttpResponseMessage 和 HttpRequstMessage,并且再次,这在本地运行时非常有效,尽管有更多代码,但是当我将它推送到服务器时会发生可怕的炸弹.. .
    【解决方案2】:

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

    不能再花时间在上面了,所以只使用Service Stack 重新实现,这样就可以了。

    【讨论】:

    • 嘿!你刚刚放弃了吗?我有一个和你类似的问题。除了使用 PUT 和 DELETE 方法的操作之外,所有操作都有效。我像你一样尝试了所有的解决方案。但放弃对我来说不是一个选择。
    • 是的,我确实放弃并重新实现了 Service Stack - 这是我更熟悉和满意的东西。如果 put 和 delete 不起作用,可能与防火墙有关,请查看:stackoverflow.com/questions/1828790/…
    • 不,即使在本地机器上也无法正常工作。让我抓狂的是同一个应用程序可以在 IIS Express 上运行。我卸载了 IIS,然后重新安装了它,并重新创建了 Web 应用程序,它工作正常!也许我的配置搞砸了。感谢您的回复。
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多