iis-7 – ASP.NET MVC4在IIS7集成模式下不处理POST请求,但在IIS7.5中

前端之家收集整理的这篇文章主要介绍了iis-7 – ASP.NET MVC4在IIS7集成模式下不处理POST请求,但在IIS7.5中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个有趣的情况我无法解释,我需要帮助弄清楚我的问题在IIS7上:

鉴于:

> ASP.NET MVC 4 Web应用程序
>默认路由注册到{controller} / {action}

请参阅以下控制器:

public class ServiceController : Controller
{
    public ActionResult Test()
    {
        return Content("Test");
    }

    [HttpPost]
    public ActionResult Test2()
    {
        return Content("Test2");
    }
}

此外,在Global.asax中有以下代码

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 404)
    {
        ExecuteIndexPage();
    }
}

protected void Application_Error(object sender,EventArgs e)
{
    var error = Server.GetLastError();
    ExceptionLogger.Log(error);

    ExecuteIndexPage();
}

所以,每当出现服务器错误时,都会记录下来.在这种情况下,在普通404的情况下,返回起始页.这工作(几乎)罚款.后来更多的

此设置在IIS7(Windows Server 2008,生产环境)和IIS7.5(Win7 Pro,开发环境和Windows Server 2008 R2,也是生产环境)上提供了非常不同的行为.

给定IIS中的以下配置(两个版本):

> IIS中的Web使用集成模式ASP.NET 4应用程序池进行配置
>< modules runAllManagedModulesForAllRequests =“true”/>在system.webServer部分中设置

在IIS 7.5中的行为是:

> GET请求到/:返回索引页
> POST请求到/:返回索引页
> GET请求到/ Service / Test:返回测试
> POST请求到/ Service / Test:返回测试
> GET请求到/ Service / Test2:执行Global.asax Application_Error:HttpException:在控制器’MyTestProject.Controllers.ServiceController’上找不到公共动作方法’Test2′.
> POST请求到/ Service / Test2:返回Test2
> GET请求的东西没有路由:执行Global.asax End_Request.

在IIS 7中,行为是:

> GET请求到/:返回索引页
> POST请求到/:IIS 404页面
> GET请求/服务/测试:返回测试
> POST请求/服务/测试:IIS 404页面
> GET请求到/ Service / Test2:执行Global.asax Application_Error:HttpException:在控制器’MyTestProject.Controllers.ServiceController’上找不到公共动作方法’Test2′.
> POST请求到/ Service / Test2:返回IIS 404页面
> GET请求的东西没有路由:IIS 404页面

所以IIS 7和IIS 7.5在使用GET请求时工作得很好,除非没有路由.
当没有路由时,IIS 7.5将执行具有状态码404的Global.asax结束请求,并传送索引页. IIS 7不执行Global.asax结束请求.为什么?
我可以通过注册一个{* catchall}路由来解决这个问题,因此存在匹配的路由.

一旦我试图使用HTTP POST,IIS 7的工作比我想象的要小.

当POST请求时,IIS 7不会在我的应用程序中执行任何代码,并直接返回一个IIS 404页面.

所以我的问题是:为什么IIS 7拒绝在我的MVC 4应用程序中处理POST请求,我该怎么办才能处理post请求?

解决方法

我们想出来了 – 终于.

默认配置将其插入到web.config中:

<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,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

问题是“*”.路径,这将覆盖/test.aspx但不简单/测试.

如果将其更改为“*”,则所有请求将由ExtensionlessUrlHandler处理,包括将不再投放的静态文件.

所以解决办法是:
从处理程序条目中删除POST动词,并为PathlessUrlHandler添加新条目,路径设置为“*”,仅适用于POST请求:

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,runtimeVersionv4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit_post" path="*" verb="POST" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit_post" path="*" verb="POST" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0_post" path="*" verb="POST" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

理想地删除您不需要的(x86和x64在经典与集成管道).

猜你在找的asp.Net相关文章