2016-02-02 33 views
2

我們有一些控制器只能處理GET請求。當POST到達時它返回一個500,我寧願返回一個405(方法不允許)。有沒有辦法對此進行設置,以便在收到POST時控制器上的所有路由返回405?一些控制器需要接受POST,所以它不能在IIS配置中(即配置爲拒絕動詞)。有關您的信息,該平臺是一個Azure Web應用程序。我可以配置控制器拒絕所有Post方法嗎?

我確實有一個解決方案,但有一個缺點,不得不被添加到每條路線,這看起來很麻煩。

[Route("example/route/{date:datetime}")] 
    [AcceptVerbs("GET", "POST")] 
    public Periods GetExampleRoute(DateTime date) 
    { 
     if (Request.Method.Method.Equals("POST")) 
     { 
      throw new HttpResponseException(HttpStatusCode.MethodNotAllowed); 
     } 
     ... GET processing ... 
    } 

回答

3

可以做一個MVCActionFilter(同樣爲Web ApiSystem.Web.Http):

public class RestrictVerbsAttribute : ActionFilterAttribute 
{ 

    private string Protocol { get; } 

    public RestrictVerbsAttribute(string verb) 
    { 
     Protocol = verb; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.RequestContext.HttpContext; 
     var result = request.Request.HttpMethod.Equals(Protocol, StringComparison.OrdinalIgnoreCase); 
     if (!result) 
     { 
      filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.MethodNotAllowed); //405 
     } 
    } 
} 

你可以在ControllerAction級別使用

[RestrictVerbs("GET")] 
public class VerbsController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

張貼到任何行動在控制器中:

Request inspection

H個...

+0

我知道必須有優於一刀切「N」粘貼至少一種方式!謝謝。 – miltonb

相關問題