2009-07-02 2 views
3

Я знаю, что вы можете ограничить, какие HTTP-методы реагирует на конкретный метод ActionResult, добавив атрибут AcceptVerbsAttribute, например.Каковы методы HTTP по умолчанию AcceptResult AcceptVerbsAttribute по умолчанию?

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() { 
    ... 
} 

Но мне было интересно: какие методы HTTP метод ActionResult будет принимать без явного [AcceptVerbs (...)] атрибут?

Я предполагаю, что это был GET, ГОЛОВА и POST, но только желая перепроверки.

Спасибо.

+0

Мое предположение было бы любым (включая также PUT, DELETE). Я думаю, вы можете узнать по экспериментам - сделайте простое тестовое действие без атрибута AcceptVerbs, проведите несколько разных запросов против него, посмотрите, что произойдет. Я хотел бы узнать ответ :-) –

ответ

5

Без AcceptVerbsAttribute ваш Action будет принимать запросы с любыми методами HTTP. BTW вы можете ограничить методы HTTP в своем RouteTable:

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }, // Parameter defaults 
    new { HttpMethod = new HttpMethodConstraint(
     new[] { "GET", "POST" }) }       // Only GET or POST 
); 
+0

Я не знал, что вы можете ограничить HTTP-методы через RouteTable - именно то, что я был после. Благодарю. –

3

Он будет принимать все HTTP-методы.

Посмотрите немного отформатирован фрагмент из ActionMethodSelector.cs (ASP.NET MVC источник может быть загружен here):

private static List<MethodInfo> RunSelectionFilters(ControllerContext 
    controllerContext, List<MethodInfo> methodInfos) 
{ 
    // remove all methods which are opting out of this request 
    // to opt out, at least one attribute defined on the method must 
    // return false 

    List<MethodInfo> matchesWithSelectionAttributes = new List<MethodInfo>(); 
    List<MethodInfo> matchesWithoutSelectionAttributes = new List<MethodInfo>(); 

    foreach (MethodInfo methodInfo in methodInfos) 
    { 
     ActionMethodSelectorAttribute[] attrs = 
      (ActionMethodSelectorAttribute[])methodInfo. 
       GetCustomAttributes(typeof(ActionMethodSelectorAttribute), 
        true /* inherit */); 

     if (attrs.Length == 0) 
     { 
      matchesWithoutSelectionAttributes.Add(methodInfo); 
     } 
     else 
      if (attrs.All(attr => attr.IsValidForRequest(controllerContext, 
       methodInfo))) 
      { 
       matchesWithSelectionAttributes.Add(methodInfo); 
      } 
    } 

    // if a matching action method had a selection attribute, 
    // consider it more specific than a matching action method 
    // without a selection attribute 
    return (matchesWithSelectionAttributes.Count > 0) ? 
     matchesWithSelectionAttributes : 
     matchesWithoutSelectionAttributes; 
} 

Так что, если нет лучшего соответствия метод действия с явным атрибутом, метод действия без атрибутов будет использоваться.

Смежные вопросы