3

我正在使用自定义过滤器来验证内容类型,例如:

        public override void OnActionExecuting(HttpActionContext httpActionContext)
        {
            List<String> errors = new List<String>();

            // a
            if (httpActionContext.Request.Content.Headers.ContentType.MediaType == "application/json")
            {
            }
            else
            {
                errors.Add("Invalid content type.");
            }

                // more checks
        }

上面的代码工作正常,但验证应该检查请求 http 动词,因为它应该只验证 put 或 post 的内容类型。我不想从 httpget 操作中删除自定义过滤器,因为我在其中有更多检查,并且我不想将过滤器分成两部分,这意味着我必须检查过滤器内的 http 动词,但我可以找不到方法。

有小费吗?

4

4 回答 4

7

您可以从中获取方法类型(post 或 put):

public override void OnActionExecuting(HttpActionContext actionContext)
{
    string methodType = actionContext.Request.Method.Method;
    if (methodType.ToUpper().Equals("POST") 
            || methodType.ToUpper().Equals("PUT"))
    {
         // Your errors
    }
}
于 2012-08-14T15:20:10.357 回答
3

如果您需要获取过滤器正在验证的请求的 HTTP Method,您可以检查请求的 Method 属性:

var method = actionContext.Request.Method;

但是,我建议您将过滤器拆开,因为您很快就会陷入泥泞的大球。

于 2012-08-14T15:25:40.240 回答
0

您确实应该在控制器方法上方使用标准 HTTPVerb 属性:

[HttpGet]
[HttpPut]
[HttpPost]
[HttpDelete]
[HttpPatch]

多个 MVC 控制器:

[AcceptVerbs(HttpVerbs.Get, HttpVerbs.Post)]

多个 WebAPI 控制器

[AcceptVerbsAttribute("GET", "POST")]
于 2013-04-26T12:40:30.170 回答
-1

在动作过滤器的构造函数中,您可以传入选项/命名参数,这些参数将为OnActionExecuting逻辑设置设置。根据这些设置,您可以切换逻辑。

public class MyActionFilterAttribute : ActionFilterAttribute
{
    private HttpVerbs mOnVerbs;

    public MyActionFilterAttribute(HttpVerbs onVerbs)
    {
        mOnVerbs = onVerbs;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var currentVerb = filterContext.HttpContext.Request.HttpMethod;

        if (mOnVerbs.HasFlag(HttpVerbs.Post)) { }
        else if (mOnVerbs.HasFlag(HttpVerbs.Get)) { }
        base.OnActionExecuting(filterContext);
    }
}

[MyActionFilter(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult Index()
{
}
于 2012-08-14T15:16:56.997 回答