Может ли веб-API ActionFilterAttribute иметь доступ к модели?

Я хотел бы иметь возможность выполнять некоторые проверки разрешений в веб-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? 
    }

Ответ 1

Вы пробовали свойство ActionArguments?

Ответ 2

У вас есть доступ к сериализованной модели через это свойство:

actionContext.Response.Content

Может быть некоторая работа, чтобы определить, что десериализовать из этого свойства. Документация по веб-API довольно редкая, но здесь официальные документы. Тип Response.Content - HttpReponseMessage, поэтому вы должны найти более подробную информацию для десериализации, ища это.

Ответ 3

Позвольте мне ответить @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
    }