2012-10-02 11 views
11

मैं एक वेब एपीआई एक्शनफिल्टर में कुछ अनुमति जांच करने में सक्षम होना चाहता हूं, इसलिए मुझे ऑब्जेक्ट आईडी खींचने में सक्षम होना चाहिए। मैं इसे GET पर कर सकता हूं क्योंकि मेरे पास रूटडेटा तक पहुंच है, लेकिन क्या यह पुष्टिकरण दृश्य तक पहुंच प्राप्त करना संभव है Pod \ POST के लिए एक एक्शन फ़िल्टर में मॉडल ऑब्जेक्ट?क्या एक वेब एपीआई ActionFilterAttribute मॉडल तक पहुंच सकता है?

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

उत्तर

12

क्या आपने ActionArguments प्रॉपर्टी की कोशिश की है?

actionContext.Response.Content

यह निर्धारित करने के लिए कुछ काम क्या है, हालांकि उस प्रॉपर्टी के deserialize करने के लिए हो सकता है:

+2

filterContext.ActionParameters – Felix

+0

बहुत बढ़िया है, धन्यवाद! – NullReference

+0

एमवीसी 5 फ़िल्टरकॉन्टेक्स्ट.एक्शन पैरामीटर में फ़िल्टर बन गया है Context.ActionDescriptor.GetParameters() (System.Web.Mvc.ParameterDescriptor की एक सरणी देता है) –

0

आप इस प्रॉपर्टी के माध्यम से धारावाहिक मॉडल की पहुंच है। वेब एपीआई दस्तावेज अभी बहुत स्पष्ट है लेकिन here is the official docs.Response.Content प्रकार HttpReponseMessage है, इसलिए आपको इसके लिए खोज करके deserialization के लिए अधिक जानकारी मिलनी चाहिए।

0

मुझे @André Scartezini के उत्तर का पालन करने दें और मैंने लिखा एक नमूना कोड जोड़ें।

यह वेब एपीआई विधि में स्वचालित रूप से पोस्ट किए गए डेटा को लॉग इन करने के लिए एक एक्शनफ़िल्टर है। यह नौकरी करने का सबसे अच्छा समाधान नहीं है बल्कि यह दिखाने के लिए एक नमूना कोड है कि मॉडल को एक्शनफिल्टर विशेषता के अंदर से कैसे पहुंचाया जाए।

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 
    } 
संबंधित मुद्दे