asp.net-mvc - Web Api 调用在服务器上返回 404

标签 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" });

对应如下 Controller 和 Action :
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>
    

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

    更新

    我重新实现了我的一个 Controller 以仅使用 HttpResponseMessageHttpRequestMessage
    [HttpGet]
    public HttpResponseMessage GetAccount(HttpRequestMessage message)
    {
        message.CreateResponse(....
    

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

    最佳答案

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

    尝试将方法的签名更改为

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

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

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

    关于asp.net-mvc - Web Api 调用在服务器上返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809128/

    相关文章:

    c# - 构建一个 self 维护的集合,在项目过期时将其删除?

    asp.net-mvc - 如何对 ASP.NET MVC Controller 的 HandleUnknownAction() 进行单元测试?

    asp.net-mvc - 使用SQL Server数据库而不是本地数据库asp.net mvc 5数据库优先的asp.net标识表

    c# - Asp.net mvc 应用程序中 Layout 和局部 View 的比较

    c# - .Net Claims Auth——无法设置当前主体

    javascript - 发布 anchor 标签值,并将 anchor 作为提交

    javascript - 如何最好地规避 MVC4 脚本捆绑

    asp.net - MvcRouteHandler在哪里注册的

    .net - 生成Excel文件错误

    asp.net - 由于检索用户的本地应用程序数据路径失败,无法生成 SQL Server 的用户实例