C# asp net web api自定义筛选器和http谓词

C# asp net web api自定义筛选器和http谓词,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我正在使用自定义筛选器验证内容类型,如: public override void OnActionExecuting(HttpActionContext httpActionContext) { List<String> errors = new List<String>(); // a if (httpActionContext.Request.Content.H

我正在使用自定义筛选器验证内容类型,如:

        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
        }
public override void OnActionExecuting(HttpActionContext HttpActionContext)
{
列表错误=新列表();
//a
if(httpActionContext.Request.Content.Headers.ContentType.MediaType==“应用程序/json”)
{
}
其他的
{
错误。添加(“无效内容类型”);
}
//更多支票
}
上面的代码工作正常,但是验证应该检查请求http谓词,因为它应该只验证put或post的内容类型。我不想从httpget操作中删除自定义筛选器,因为我在其中有更多的检查,我不想将筛选器分成两部分,这意味着我必须检查筛选器中的http谓词,但我找不到如何操作


任何提示?

在操作筛选器的构造函数中,您可以传入选项/命名参数,这些选项/命名参数将设置
操作执行
逻辑的设置。根据这些设置,您可以切换您的逻辑

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()
{
}

您可以从以下位置获取方法类型(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
    }
}

如果需要获取筛选器验证的请求的HTTP方法,可以检查请求的Method属性:

var method = actionContext.Request.Method;

但是,我建议您将过滤器拆开,因为您很快就会进入一个大泥球场景。

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

[HttpGet]
[HttpPut]
[HttpPost]
[HttpDelete]
[HttpPatch]
MVC控制器用于多个:

[AcceptVerbs(HttpVerbs.Get, HttpVerbs.Post)]
用于多个应用程序的WebAPI控件

[AcceptVerbsAttribute("GET", "POST")]

为什么要限制数据的媒体表示?开箱即用的XML和JSON都受支持,媒体处理程序可以为您将表示转换为强类型对象。最好让您的API传达它接受的媒体类型,然后在必要时返回错误的请求错误。因为我们只支持json(文档、版本控制等)。我想这取决于您,但是支持多种媒体类型并让web API处理从格式到对象的转换的能力并不是我可以轻易放弃的。@相反,我只是简单地评论一下,说您可能会返回415个不受支持的媒体类型,这是一个不错的请求。@Mark Jones,您是对的,这正是我想要说的;-)抢手货这是一个商业api,我们只提供json的支持和文档。我们将不支持任何与xml相关的内容。这是一项业务要求。@user1330271如果您“不支持任何与xml相关的内容”,那么要完全删除xml,您可以删除配置中的xml格式:void ConfigureApi(HttpConfiguration config){//删除xml格式化程序config.Formatters.remove(config.Formatters.XmlFormatter);}#Facepalm为什么WebAPI没有附带MVC中可用的HttpVerbs?我很高兴他们在ASP.NET中合并了这两者5@CuongLe如何获取已发布的操作值(在对象中而不是在querystring中)。你们的答案是MVC而不是WebAPI