Почему в классе System.Web.Mvc.HttpVerbs отсутствуют TRACE, CONNECT & OPTIONS?
Определение RFC 2616 HTTP/1.1 гласит, что существуют следующие распространенные методы HTTP:
ПОЛУЧИТЬ, ЗАГОЛОВИТЬ, ПОСТИТЬ, ПОСТАВИТЬ, УДАЛИТЬ, СЛЕДИТЬ, ВАРИАНТЫ, ПОДКЛЮЧИТЬ
Но в перечислении System.Web.Mvc.HttpVerbs отсутствует TRACE, OPTIONS & CONNECT.
У меня есть фильтр действий, который выбирает HttpVerb из запроса, чтобы принять определенные решения (например, если запрос представляет собой модель базового типа A, то я устанавливаю некоторые данные), поэтому этот код утилиты создает исключение ArgumentOutOfRangeException для запросов последних трех (в основном, OPTIONS - похоже, оно исходит от Google Translate):
public static HttpVerbs GetHttpVerb(this HttpRequestBase httpRequestBase)
{
switch (httpRequestBase.HttpMethod)
{
case "GET":
return HttpVerbs.Get;
case "POST":
return HttpVerbs.Post;
case "PUT":
return HttpVerbs.Put;
case "DELETE":
return HttpVerbs.Delete;
case "HEAD":
return HttpVerbs.Head;
default:
throw new ArgumentOutOfRangeException("httpRequestBase");
}
}
Не уверен, как обойти это - есть идеи?
Единственное, о чем я могу думать, это изменить весь ссылочный код, чтобы сначала проверить необработанный HTTP-метод, а затем вызывать утилиту, только если это не TRACE, OPTIONS или CONNECT. Который вроде хакерский.
Почему он отсутствует в классе enum? Есть ли конкретная причина для этого? Может ли MVC просто не обрабатывать запросы этих типов?
Судя по звуку метода OPTIONS, он даже не должен попадать в MVC, и он должен обрабатываться самим IIS?
1 ответ
Закончилось создание собственного перечисления и использование этого.
public enum HttpVerb
{
Get,
Head,
Post,
Put,
Delete,
Trace,
Options,
Connect
}
MVC по-прежнему обрабатывает запросы типа OPTIONS.