我有一個有趣的情況下,我無法解釋,我需要幫助搞清楚我的問題是什麼在IIS7:ASP.NET MVC4不處理在IIS7集成模式POST請求,但在IIS7.5
鑑於:
- ASP.NET MVC 4 web應用
- 缺省路由註冊到{控制器}/{行動}
參見下面的控制器:
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是使用集成模式 ASP.NET 4應用池
- <模塊runAllManagedModulesForAllRequests = 「真」/ >配置設置在system.webServer部分
IIS 7.5的行爲是:
- GET請求/:返回索引頁
- POST請求/:返回索引頁
- GET請求/服務/測試:返回測試
- POST請求/服務/測試:返回測試
- GET請求/ Service/Test2:執行Global.asax Application_Error:HttpException:在控制器'MyTestProject.Controllers.ServiceController'上找不到公共操作方法'Test2'。
- POST請求/服務/ Test2的:返回的Test2
- GET請求來的東西有毫無路線:執行Global.asax中END_REQUEST。
在IIS 7行爲改用:
- GET請求/:返回索引頁
- POST請求/:IIS 404頁
- GET請求/服務/測試:返回測試
- POST請求/服務/測試:IIS 404頁面
- GET請求/服務/測試2:執行Global.asax Application_Error:HttpException:在控制器'MyTestProject.Controllers.ServiceController'上未找到公共操作方法'Test2'。
- POST請求/服務/ 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的工作效率甚至比我預想的要低。
發佈請求時,IIS 7不會在我的應用程序中執行任何代碼,並直接返回IIS 404頁面。
所以我的問題是:爲什麼IIS 7拒絕如此難以處理我的MVC 4應用程序中的POST請求,以及我能做些什麼來處理POST請求?