加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 23:10:35 所属栏目:asp.Net 来源:网络整理
导读:我有一个有趣的情况我无法解释,我需要帮助弄清楚我的问题在IIS7上: 鉴于: ASP.NET MVC 4 Web应用程序 默认路由注册到{controller} / {action} 请参阅以下控制器: public class ServiceController : Controller{ public ActionResult Test() { return Cont
我有一个有趣的情况我无法解释,我需要帮助弄清楚我的问题在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.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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.NETFrameworkv4.0.30319aspnet_isapi.dll" preCondition="classicMode,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit_post" path="*" verb="POST" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_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在经典与集成管道).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读