我有一个我无法解释的有趣案例,我需要帮助找出我在 IIS7 上的问题:
鉴于:
请参阅以下 Controller :
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 7.5 行为是:
在 IIS 7 相反,行为是:
因此,IIS 7 和 IIS 7.5 在使用 GET 请求时运行良好,除非没有路由。
当没有路由时,IIS 7.5 执行带有状态码 404 的 Global.asax 结束请求并传递索引页。 IIS 7 执行 不是 执行 Global.asax 结束请求。为什么?
我可以(并且目前正在)通过注册 {*catchall} 路由来解决此问题,以便存在匹配的路由。
当我尝试使用 HTTP POST 时,IIS 7 的工作量甚至低于我的预期。
发布请求时,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,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
问题是“*”。路径,它将涵盖/test.aspx,但不仅仅是/test。
如果将其更改为“*”,则所有请求都将由 ExtensionlessUrlHandler 处理,包括那些将不再提供服务的静态文件。
所以解决方案是:
从处理程序条目中删除 POST 动词,并为 ExtensionlessUrlHandler 添加新条目,并将路径设置为“*”并且仅用于 POST 请求:
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,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,HEAD,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,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,runtimeVersionv4.0,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,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0_post" path="*" verb="POST" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
理想情况下删除您不需要的那些(经典与集成管道中的 x86 和 x64)。
关于iis-7 - ASP.NET MVC4 不在 IIS7 集成模式下处理 POST 请求,而是在 IIS7.5 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711414/