Ответ 1
Вы пробовали свойство ActionArguments?
Я хотел бы иметь возможность выполнять некоторые проверки разрешений в веб-api ActionFilter, поэтому мне нужно иметь возможность вывести идентификатор объекта. Я могу сделать это с помощью GET, так как у меня есть доступ к RouteData, но возможно ли получить доступ к объекту с просмотренным представлениемModel в фильтре действий для PUT\POST?
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
//Get ID from searlized object and check permissions for a POST\PUT?
}
Вы пробовали свойство ActionArguments?
У вас есть доступ к сериализованной модели через это свойство:
actionContext.Response.Content
Может быть некоторая работа, чтобы определить, что десериализовать из этого свойства. Документация по веб-API довольно редкая, но здесь официальные документы. Тип Response.Content
- HttpReponseMessage
, поэтому вы должны найти более подробную информацию для десериализации, ища это.
Позвольте мне ответить @André Scartezini и добавить пример кода, который я написал.
Это ActionFilter для автоматической регистрации опубликованных данных в методе Web API. Это не лучшее решение для выполнения этой задачи, а всего лишь пример кода, чтобы показать, как получить доступ к модели из атрибута ActionFilter.
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace LazyDIinWebApi.Models
{
public class LogPostDataAttribute : ActionFilterAttribute
{
public override async Task OnActionExecutingAsync(
HttpActionContext actionContext,
CancellationToken cancellationToken)
{
Collection<HttpParameterDescriptor> parameters
= actionContext.ActionDescriptor.GetParameters();
HttpParameterDescriptor parameter
= parameters == null ? null : parameters.FirstOrDefault();
if (parameter != null)
{
string parameterName = parameter.ParameterName;
Type parameterType = parameter.ParameterType;
object parameterValue =
actionContext.ActionArguments == null && !actionContext.ActionArguments.Any() ?
null :
actionContext.ActionArguments.First().Value;
string logMessage =
string.Format("Parameter {0} (Type: {1}) with value of '{2}'"
, parameterName, parameterType.FullName, parameterValue ?? "/null/");
// use any logging framework, async is better!
System.Diagnostics.Trace.Write(logMessage);
}
base.OnActionExecuting(actionContext);
}
}
}
И вот как это использовать:
// POST: api/myapi
[LogPostData]
public void Post(MyEntity myEntity)
{
// Your code here
}