У меня есть интересный случай, который я не могу объяснить, и мне нужна помощь в выяснении моей проблемы с 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 (обе версии):
- Web в IIS настроен с использованием пула приложений
- < modules runAllManagedModulesForAllRequests = "true" / > устанавливается в разделе system.webServer
В IIS 7.5 поведение:
- Запрос GET в /: возвращает страницу индекса
- Запрос POST для /: Возвращает индексную страницу
- Запрос GET в /Service/Test: тест возврата
- Запрос POST в /Service/Test: тест возврата
- Запрос GET в /Service/Test 2: Executes Global.asax Application_Error: HttpException: Открытый метод действий Test2 не найден на контроллере MyTestProject.Controllers.ServiceController.
- Запрос POST в /Service/Test 2: возвращает Test2
- GET-запрос к чему-то нет пути для: Выполняет Global.asax End_Request.
В IIS 7 вместо этого выполняется следующее:
- Запрос GET в /: возвращает страницу индекса
- Запрос POST на страницу IIS 404
- GET Запрос/Сервис/Тестирование: Тест возврата
- Запрос на отправку/обслуживание/тестирование: страница IIS 404
- GET Request to/Service/Test2: Executes Global.asax Application_Error: HttpException: Открытый метод действий Test2 не найден на контроллере MyTestProject.Controllers.ServiceController.
- Запрос POST/Service/Test2: возвращает страницу IIS 404
- GET Запрос на то, что нет маршрута для: страницы IIS 404
Итак, IIS 7 и IIS 7.5 отлично работают при использовании запросов GET, за исключением случаев, когда маршрута нет. Когда маршрута нет, IIS 7.5 выполняет конечный запрос Global.asax с кодом состояния 404 и доставляет индексную страницу. IIS 7 выполняет НЕ выполнение запроса окончания Global.asax. Зачем? Я мог (и в настоящее время) работать над этой проблемой, зарегистрировав маршрут {* catchall}, чтобы существовал соответствующий маршрут.
Как только я пытаюсь использовать HTTP POST, IIS 7 работает даже меньше, чем я ожидал.
При отправке запроса IIS 7 не выполняет какой-либо код в моем приложении и напрямую возвращает страницу IIS 404.
Итак, мой вопрос: почему IIS 7 отказывается так сложно обрабатывать запросы POST в моем приложении MVC 4, и что я могу сделать, чтобы он также обрабатывал почтовый запрос?