2014-04-05 5 views
12

मैं उस शरीर के साथ HTTP पोस्ट अनुरोध भेजना चाहता हूं जिसमें एक साधारण ब्लॉग पोस्ट, कुछ भी फैंसी नहीं है।मैं एएसपी.NET वेब एपीआई वैल्यूप्रोवाइडर में HTTP POST अनुरोध से बॉडी वैल्यू कैसे प्राप्त करूं?

मैं here पढ़ा है जब आप एक जटिल प्रकार है (यानी एक प्रकार है कि है नहीं string, int आदि) वेब एपीआई में बाध्य करने के लिए चाहते हैं, तो एक अच्छा दृष्टिकोण कस्टम मॉडल बांधने की मशीन बनाने के लिए है कि।

मेरे पास एक कस्टम मॉडल बाइंडर (BlogPostModelBinder) है जो बदले में कस्टम वैल्यू प्रदाता (BlogPostValueProvider) का उपयोग करता है। जो मुझे समझ में नहीं आता है वह है कि मैं BlogPostValueProvider में अनुरोध निकाय से डेटा कैसे प्राप्त कर सकता हूं?

मॉडल बाइंडर के अंदर यह है कि मैंने सोचा कि उदाहरण के लिए शीर्षक सही तरीके से प्राप्त करना सही तरीका होगा।

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
{ 
    ... 
    var title= bindingContext.ValueProvider.GetValue("Title"); 
    ... 
} 

BlogPostValueProvider इस तरह दिखता है, जबकि:

public class BlogPostValueProvider : IValueProvider 
{ 
    public BlogPostValueProvider(HttpActionContext actionContext) 
    { 
     // I can find request header information in the actionContext, but not the body. 
    } 

    public ValueProviderResult GetValue(string key) 
    { 
     // In some way return the value from the body with the given key. 
    } 
} 

यह एक आसान तरीका में व्याख्या करने योग्य हो सकता है, लेकिन जब से मैं वेब एपीआई की खोज कर रहा हूँ यह है कि यह काम करने के लिए प्राप्त करने के लिए अच्छा होगा।

मेरी समस्या यह है कि मुझे नहीं पता कि अनुरोध निकाय कहां संग्रहीत किया जाता है।

किसी भी मार्गदर्शन के लिए धन्यवाद!

+0

आपके अनुरोध सामग्री प्रकार क्या है actionContext में ActionArguments उपयोग करने के लिए था ... मैं हूँ formurlencoded मानते हैं ... ... क्या आप एक कस्टम मॉडल बाइंडर की आवश्यकता क्यों है, इसके बारे में अधिक जानकारी दे सकते हैं ... –

+0

यदि आप BlogPostVM का एक जेसन पोस्ट कर रहे हैं तो आपको केवल एक कार्यवाही की आवश्यकता है जो BlogPostVM स्वीकार करता है, कस्टम बाइंडर्स की आवश्यकता नहीं है। –

+0

मुझे लगता है कि आप दोनों सही हैं। अनुरोध में ContentType json @KiranChalla पर सेट है। ब्लॉगपॉस्ट प्रकार के पैरामीटर के साथ कार्रवाई करने से यह हो सकता है। मैं अभी भी जानना चाहूंगा कि मैं मूल्य प्रदाता के भीतर से अनुरोध के शरीर तक क्यों नहीं पहुंच सकता। –

उत्तर

15

रिक स्ट्राल से इसके बारे में blog post यहां है। उनकी पोस्ट लगभग आपके प्रश्न का उत्तर देती है। अपनी जरूरतों के लिए अपना कोड अनुकूलित करने के लिए, आप निम्न कार्य करेंगे।

अपने मूल्य प्रदाता के कन्स्ट्रक्टर के भीतर, इस तरह के अनुरोध निकाय को पढ़ें।

Task<string> content = actionContext.Request.Content.ReadAsStringAsync(); 
string body = content.Result; 
0

मैं प्रवेश के लिए एक ActionFilterAttribute में ऐसा करने की जरूरत है, और समाधान मैंने पाया के रूप में में

public class ExternalApiTraceAttribute : ActionFilterAttribute 
{ 


    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     ... 

     var externalApiAudit = new ExternalApiAudit() 
     { 

      Method = actionContext.Request.Method.ToString(), 
      RequestPath = actionContext.Request.RequestUri.AbsolutePath, 
      IpAddresss = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress, 
      DateOccurred = DateTime.UtcNow, 
      Arguments = Serialize(actionContext.ActionArguments) 
     }; 
संबंधित मुद्दे