【问题标题】:All POST MVC Requests give 404 error所有 POST MVC 请求都给出 404 错误
【发布时间】:2015-12-02 17:27:23
【问题描述】:

我有一个 MVC 应用程序,当我使用 POST 请求时出现 404 错误。

以下是相关的代码:

我有一个 WebAPI 控制器(虽然这也发生在“纯”MVC 控制器中),其中只有一个方法:

public class GetSomeDataController : ApiController
{
    [HttpPost]
    public string GetNumbers([FromBody]string value)
    {
        // Get 10 randomised numbers

        return //The numbers as JSON;
    }
}

在 JavaScript 中我有一个 ajax 请求:

$.ajax({
    type: "POST",
    url: "/Api/GetSomeData/GetNumbers/",
    data: JSON.stringify(requestData),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    processData: false, // Pass the data in the body of the request rather than in the URI.
})
.done(function (ajaxResult) {
    // handle the results
})
.fail(function (e) {
    // Handle errors
});

当我在 VS 2013 中对其进行调试时,我的 10 个数字完全没有问题。但是,当我在 IIS 8.5 中运行完全相同的代码时...

页面本身是一个 MVC 路由页面,因此路由在服务器上工作,但是当我从 POST 调用控制器操作时它不起作用。

错误页面报告 StaticFile 处理程序似乎正在尝试处理请求 - 这当然失败了。

我想弄清楚发生了什么。有人有什么想法吗?

这些是我记得尝试过的事情:

在 web.config 中添加各种东西(没有明显的效果):

<system.web>
    <httpModules>
        <add name="UrlRoutingModule"
            type="System.Web.Routing.UrlRoutingModule,
            System.Web.Routing, Version=3.5.0.0,
            Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </httpModules>
</system.web>
<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

,

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>
  • 我肯定在集成模式下运行
  • 应用程序池在有权访问文件夹的帐户下运行
  • 应用程序池在 .NET 4.0 中运行
  • 在 Windows 功能和设置中禁用和重新启用 ASP.NET 4.5
  • aspnet_regiis - i(IIS 8.5 不支持)
  • 跟踪请求:(无新信息)

  • 将 ExtensionlessUrlHandler-Integrated-4.0 请求路径更改为“*”

  • 更改 ExtensionlessUrlHandler-Integrated-4.0 动词(POST 已包含在列表中)

【问题讨论】:

  • 试试这个方法:url: "/Api/GetSomeData"
  • 我已经尝试过了,但它在 VS 中调试或从 IIS 运行时都不起作用 - 请注意,我不希望它如此,因为我注册的 WebAPI 路由需要一个操作以及一个控制器:routeTemplate: "api/{controller}/{action}"
  • 谢谢 - 我正在根据标题为 HTTP 方法和按操作名称路由的部分组合配置和使用我的路由。正如我在帖子中所说,这不是路由问题 - 路由会在 IIS Express 中显示调试 - 这是一个 IIS 配置问题。

标签: ajax asp.net-mvc asp.net-mvc-5 iis-8


【解决方案1】:

答案变成与 IIS 或路由无关。

在本地 IIS 中调试或从 IIS 运行站点时,我将应用程序作为子应用程序运行 - 即我的应用程序的地址不是 http://localhost/,而是 Http://localhost/WebScratchPad/

由于 $.ajax 请求中的这一行,AJAX 请求的目标是 Http://localhost/Api/GetSomeData/GetNumbers/

url: "/Api/GetSomeData/GetNumbers/",

他们应该去Http://localhost/WebScratchPad/Api/GetSomeData/GetNumbers/

通过这样做:

url: "/WebScratchPad/Api/GetSomeData/GetNumbers/",

在 Web.config 中四处逛逛!

当然,这并不是理想的动态解决方案——我的应用程序不必安装在 IIS 服务的某个网站的子应用程序上——所以我将从配置中传递一个前缀或类似于根据this SO answer 允许“/WebScratchPad/”部分有点动态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2017-01-22
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多