由于其性质,AuthoriseAttribute 看起来像是在模型绑定器和参数绑定运行之前在管道中调用它。当您访问 Request.Content 并从中读取时,您也会遇到问题...这只能完成一次,如果您要在 auth 属性中尝试它,您可能会破坏 mediaTypeFormater...
在 WebAPI 中,请求主体(一个 HttpContent)可能是一个只读的、无限的、非缓冲的、不可回退的流。
更新
有不同的方法来指定执行上下文... http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx。AuthoriseAttribute 是“全局”的,因此访问操作信息的时间过早。
鉴于您想要访问模型和参数,您可以稍微改变您的方法并使用 OnActionExecuting 过滤器(“Action”过滤器范围),并根据您的验证抛出 401 或 403。
此过滤器稍后在执行过程中调用,因此您可以完全访问绑定的数据。
下面非常简单的例子:
public class ApiAuthorizationFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
Foo model = (Foo)actionContext.ActionArguments["model"];
string param1 = (string)actionContext.ActionArguments["param1"];
int param2 = (int)actionContext.ActionArguments["param2"];
if (model.Id != "1")
throw new HttpResponseException(System.Net.HttpStatusCode.Forbidden);
base.OnActionExecuting(actionContext);
}
}
示例控制器:
public class Foo
{
public string Id { get; set; }
public DateTime Time { get; set; }
}
public class FoosController : ApiController
{
// PUT api/foos/5
[ApiAuthorizationFilter]
public Foo Put(int id, Foo model, [FromUri]string param1 = null, int? param2 = null)
{
return model;
}
}
其他答案在说什么......他们是对的,如果您可以访问 URL 上所需的所有内容,则可以通过请求获取内容;但是,我认为模型和请求内容应该单独保留:
var queryStringCollection = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query);
//example for param1
string param1 = queryStringCollection["param1"];
//example for param2
int param2 = int.Parse(queryStringCollection["param2"]);
//Example of getting the ID from the URL
var id = actionContext.Request.RequestUri.Segments.LastOrDefault();