2012-04-23 12 views
9

मैंने एक फ़िल्टर बनाया है जो एएसपीनेट वेब एपीआई में System.Web.Http.Filters.ActionFilterAttribute को विरासत में लेता है और HttpActionExecutedContext परिणाम ऑब्जेक्ट के अंदर कुछ डेटा तक पहुंच बनाना चाहता है।HttpActionExecutedContext परिणाम मान प्राप्त करना

किस चरण/इस वस्तु जब आबादी वाले हो जाता है पर

? जैसा कि मैंने OnActionExecuted विधि को ओवरराइड करते समय देखा और यह हमेशा शून्य है?

कोई भी विचार?

संपादित करें:

उदाहरण के लिए

यहाँ अपने कस्टम फिल्टर में:

public override OnActionExecuted(HttpActionExecutedContext context) 
{ 
    //context.Result.Content is always null 

    base.OnActionExecuted(context); 
} 
+0

कुछ शेयर कोड। क्या आप बीटा रिलीज या सोर्स कोड रिलीज का उपयोग कर रहे हैं? इससे मेरा काम बनता है। – Aliostad

+0

@Aliostad हाय बीटा रिलीज का उपयोग कर रहा हूँ। तुम क्या प्रयोग कर रहे हो? – gdp

+0

मैं वही बीटा रिलीज का उपयोग कर रहा हूं। – Aliostad

उत्तर

7

सामग्री परिणाम पर ReadAsStringAsync का उपयोग कर समाप्त हो गया। मैं वास्तविक अनुरोध समाप्त होने से पहले संपत्ति तक पहुंचने का प्रयास कर रहा था।

+0

ReadAsStringAsync वापस कर सकती है "" यदि सामग्री धारा पहले से ही से पढ़ा जा चुका है (बहुत, बहुत संभावना है)। यह सुनिश्चित करने के लिए @ वीरेंडर के समाधान का उपयोग करें कि आप हमेशा स्थिति 0 से स्ट्रीम पढ़ते हैं। – mikesigs

2

सम्मानित जवाब ReadAsStringAsync करने के लिए भेजा है, जवाब नहीं उदाहरण के लिए किया था। मैं सकल घरेलू उत्पाद से सलाह का पालन और कुछ-कुछ काम कर उदाहरण व्युत्पन्न ...

मैं MessageInterceptor नामक एकल वर्ग बनाया। मैंने ActionFilterAttribute से प्राप्त करने के अलावा कुछ भी नहीं किया और यह तुरंत नियंत्रक से पहले वेबएपीआई विधि कॉल को अवरुद्ध करना शुरू कर दिया, और नियंत्रक समाप्त होने के बाद। यहां मेरी अंतिम कक्षा है। XML उदाहरण स्ट्रिंग में अनुरोध और प्रतिक्रिया दोनों प्राप्त करने के लिए यह उदाहरण XML Serializer का उपयोग करता है। इस उदाहरण में आबादी वाले वस्तुओं के रूप में अनुरोध और प्रतिक्रिया मिलती है, इसका मतलब है कि deserialization पहले से ही हुआ है। एक आबादी वाले मॉडल से डेटा एकत्र करना और एक्सएमएल स्ट्रिंग में क्रमबद्ध करना अनुरोध और प्रतिक्रिया का प्रतिनिधित्व है - वास्तविक पोस्ट अनुरोध और प्रतिक्रिया आईआईएस द्वारा वापस भेजी गई नहीं है।

कोड उदाहरण - MessageInterceptor

using System.IO; 
using System.Linq; 
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; 
using System.Xml.Serialization; 

namespace webapi_test 
{ 
    public class MessageInterceptor : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      base.OnActionExecuting(actionContext); 
      var headers = actionContext.Request.Content.Headers.ToString(); 
      var request = actionContext.ActionArguments.FirstOrDefault().Value; 
      var xml = SerializeXMLSerializer(request, ""); 
     } 

     public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
     { 
      base.OnActionExecuted(actionExecutedContext); 
      var headers = actionExecutedContext.Response.Content.Headers.ToString(); 
      var response = actionExecutedContext.Response.Content.ReadAsStringAsync().Result; 
      var xml = SerializeXMLSerializer(response, ""); 
     } 

     public static string SerializeXMLSerializer(object o, string nameSpace) 
     { 
      string serializedValue; 
      var writer = new StringWriter(); 
      XmlSerializer serializer = new XmlSerializer(o.GetType(), nameSpace); 
      serializer.Serialize(writer, o); 
      serializedValue = writer.ToString(); 
      return serializedValue; 
     } 
    } 
} 
+0

आपको एक्सेस नहीं करना चाहिए। सीधे, यह ब्लॉक करता है, आप भी Async/ReadAsStringAsync का इंतजार करना चाहते हैं। – gdp

+1

सकल घरेलू उत्पाद - नहीं यकीन है कि मैं समझता हूँ कि अपनी टिप्पणी "Asnyc/इंतजार ReadAsStringAsync चाहते हैं"। नियंत्रक को निकाल दिया गया है, और समाप्त हो गया है के बाद OnActionExecuted। ब्लॉक, या के लिए इंतजार करना कुछ भी नहीं है - पूरे प्रतिक्रिया उपलब्ध है ... – barrypicker

4

उपयोग वेब एपीआई में अनुरोध के शरीर पाने के लिए इस समारोह

नीचे
private string GetBodyFromRequest(HttpActionExecutedContext context) 
{ 
    string data; 
    using (var stream = context.Request.Content.ReadAsStreamAsync().Result) 
    { 
     if (stream.CanSeek) 
     { 
      stream.Position = 0; 
     } 
     data = context.Request.Content.ReadAsStringAsync().Result; 
    } 
    return data; 
} 
+0

यह के लिए काम करता 'HttpActionExecutedContext', लेकिन क्या' System.Web.Mvc.ActionExecutedContext' के बारे में है? –

0

उपयोग रिस्पांस स्ट्रिंग को पढ़ने के लिए:

public static string GetResponseContent(HttpResponseMessage Response) 
    { 
     string rawResponse = string.Empty; 
     try 
     { 
      using (var stream = new StreamReader(Response.Content.ReadAsStreamAsync().Result)) 
      { 
       stream.BaseStream.Position = 0; 
       rawResponse = stream.ReadToEnd(); 
      } 
     } 
     catch (Exception ex) { throw; } 
     return rawResponse; 
    } 
संबंधित मुद्दे