2012-10-02 12 views
11

Mi piacerebbe essere in grado di eseguire alcuni controlli di autorizzazione in un ambiente Web ActionFilter, quindi devo essere in grado di estrarre l'ID oggetto. Posso farlo su un GET poiché ho accesso a RouteData, ma è possibile accedere all'oggetto viewModel searlized in un filtro di azione per un PUT \ POST?Una API Web ActionFilterAttribute può accedere al modello?

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

risposta

12

Hai provato la proprietà ActionArguments?

+2

filterContext.ActionParameters – Felix

+0

Impressionante, grazie! – NullReference

+0

In MVC5 filterContext.ActionParameters è diventato filterContext.ActionDescriptor.GetParameters() (restituisce un array di System.Web.Mvc.ParameterDescriptor) –

0

si ha accesso al modello serializzato attraverso quest'affare:

actionContext.Response.Content

Può essere un po 'di lavoro per determinare che cosa per deserializzare da quella proprietà però. La documentazione dell'API Web è al momento piuttosto scarna ma here is the official docs. Il tipo Response.Content è HttpReponseMessage quindi dovresti trovare ulteriori dettagli per la deserializzazione cercando tale.

0

Lasciami seguire la risposta di @André Scartezini e aggiungere un codice di esempio che ho scritto.

È un ActionFilter per registrare automaticamente i dati inviati in un metodo API Web. Non è la soluzione migliore per fare il lavoro ma solo un codice di esempio per mostrare come accedere al modello dall'interno di un attributo 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); 
     } 
    } 
} 

E questo è come usarlo:

// POST: api/myapi 
    [LogPostData] 
    public void Post(MyEntity myEntity) 
    { 
     // Your code here 
    } 
Problemi correlati