AuthoriseAttribute は、その性質上、モデル バインダーとパラメーター バインディングが実行される前にパイプラインで呼び出されるように見えます。また、Request.Content にアクセスして読み取るときにも問題が発生します...これは1 回しか実行できず、auth 属性で試してみると、mediaTypeFormater が壊れる可能性があります...
WebAPI では、リクエスト ボディ (HttpContent) は、読み取り専用、無限、バッファなし、巻き戻し不可のストリームである場合があります。
更新
実行コンテキストを指定するにはさまざまな方法があります... http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx . AuthoriseAttribute は「グローバル」であるため、アクション情報にアクセスするにはヒットが早すぎます。
モデルとパラメーターへのアクセスが必要な場合は、アプローチをわずかに変更し、代わりに OnActionExecuting フィルター (「アクション」フィルター スコープ) を使用して、検証に基づいて 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();