【发布时间】:2013-01-20 14:36:59
【问题描述】:
我有一个我无法解释的有趣案例,我需要帮助找出我在 IIS7 上的问题:
给定:
- ASP.NET MVC 4 网络应用程序
- 默认路由注册到 {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 应用程序池配置的
-
在 system.webServer 部分设置
在 IIS 7.5 中,行为是:
- GET 请求到 /:返回索引页
- 对 / 的 POST 请求:返回索引页
- 对 /Service/Test 的 GET 请求:返回 Test
- 对 /Service/Test 的 POST 请求:返回 Test
- 对 /Service/Test2 的 GET 请求:执行 Global.asax Application_Error:HttpException:在控制器“MyTestProject.Controllers.ServiceController”上找不到公共操作方法“Test2”。
- 对 /Service/Test2 的 POST 请求:返回 Test2
- GET 请求没有 路由的对象:执行 Global.asax End_Request。
在 IIS 7 中,行为改为:
- GET 请求到 /:返回索引页
- POST 请求到 /:IIS 404 页面
- GET 请求到 /Service/Test:返回 Test
- 对 /Service/Test 的 POST 请求:IIS 404 页面
- 对 /Service/Test2 的 GET 请求:执行 Global.asax Application_Error:HttpException:在控制器“MyTestProject.Controllers.ServiceController”上找不到公共操作方法“Test2”。
- 对 /Service/Test2 的 POST 请求:返回 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 请求?
【问题讨论】:
标签: iis-7 asp.net-mvc-4 iis-7.5