11

Web API ActionFilterでいくつかの権限チェックを実行できるようにしたいので、オブジェクトIDを引き出すことができる必要があります。RouteDataにアクセスできるので、GETでこれを行うことができますが、PUT \ POSTのアクションフィルターで、シールされたviewModelオブジェクトにアクセスすることはできますか?

 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? 
    }
4

3 に答える 3

13

ActionArgumentsプロパティを試しましたか?

于 2012-10-02T20:37:09.780 に答える
0

このプロパティを介してシリアル化されたモデルにアクセスできます。

actionContext.Response.Content

ただし、そのプロパティから何を逆シリアル化するかを決定するのは、ある程度の作業になる可能性があります。Web APIのドキュメントは現在かなりまばらですが、ここに公式のドキュメントがあります。Response.ContentタイプはそのHttpReponseMessageため、それを検索して逆シリアル化の詳細を見つける必要があります。

于 2012-10-02T20:44:35.233 に答える
0

@AndréScarteziniの答えに従って、私が書いたサンプルコードを追加しましょう。

投稿されたデータをWebAPIメソッドに自動的に記録するのはActionFilterです。これは、この作業を行うための最良のソリューションではありませんが、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
    }
于 2015-12-27T20:36:02.640 に答える