鉴于:
> 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在经典与集成管道).