所有POST MVC请求都会出现404错误

时间:2015-12-02 17:27:23

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

我有一个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中运行完全相同的代码时...... enter image description here

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

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

我想知道发生了什么事情。有没有人有任何想法?

这些是我记得的事情:

向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不支持)
  • 跟踪请求:(没有新信息) enter image description here

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

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

1 个答案:

答案 0 :(得分: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提供的某个网站的子应用程序上 - 所以我会传递一个前缀从配置或类似的允许&#34; / WebScratchPad /&#34;根据{{​​3}},部分变得有点动态。