Ответ 1
В силу своей природы AuthoriseAttribute выглядит так, как будто он вызывается в конвейере до того, как запущены привязки модели и привязки параметров. Вы также сталкиваетесь с проблемами при доступе к Request.Content и чтении из него... это может быть только сделано один раз, и если вы собираетесь попробовать его в своем auth атрибут, вы можете сломать mediaTypeFormater...
в WebAPI, тело запроса (HttpContent) может быть потоком без ограничений, только для чтения, без буферизации.
Обновление Существуют разные способы указания контекста выполнения... http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx. Авторизованный атрибут "Глобальный", поэтому ему слишком рано обращаться к информации о действиях.
Учитывая, что вы хотите получить доступ к модели и параметрам, вы можете слегка изменить свой подход и использовать фильтр 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();