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