2013-07-07 5 views
11

रनर के भीतर सर्विसस्टैक अनुरोध के कच्चे अनुरोध निकाय को प्राप्त करने के लिए, यह बड़ी हैकरी के बिना, संभव है?सर्विसस्टैक धावक अनुरोध बॉडी प्राप्त कर सकते हैं?

मैं नई एपीआई (सेवा और धावक) का उपयोग कर सर्विसस्टैक के शीर्ष पर चलाने के लिए एक ओथ सेवा प्रदाता लिख ​​रहा हूं। ओएथ हस्ताक्षर कैसे काम करता है इसके कारण मुझे प्रत्येक अनुरोध के लिए कच्चे अनुरोध निकाय की आवश्यकता है। OAuth सुरक्षा परत को धावक में जोड़ा जाता है ताकि एक अवैध OAuth अनुरोध सेवा वर्ग में किसी भी बॉयलरप्लेट के बिना आसानी से खाली/त्रुटि प्रतिक्रिया लौटा सकता है या एक विशेष "OAuthService" वर्ग को उपclassing कर सकता है।

उत्तर

15

रॉ अनुरोध निकाय का उपयोग करने का तरीका IHttpRequest.GetRawBody() का उपयोग करना है या IHttpRequest.InputStream से पढ़ना है।

लेकिन चूंकि HTTP अनुरोध निकाय एकमात्र धारा है, डिफ़ॉल्ट रूप से इसे केवल एक बार कहा जा सकता है जिसे आमतौर पर अनुरोध डीटीओ को deserialize करने के लिए ServiceStack द्वारा बुलाया जाता है। Serialization and Deserialization docs अनुरोध deserializing छोड़ ServiceStack बता और साथ अनुरोध डीटीओ में अपठित अनुरोध स्ट्रीम इंजेक्षन करने के लिए कैसे पता चलता है:

public class Hello : IRequiresRequestStream 
{ 
    /// <summary> 
    /// The raw Http Request Input Stream 
    /// </summary> 
    Stream RequestStream { get; set; } 
} 

आप अभी भी ServiceStack अनुरोध डीटीओ deserialize करने के लिए, लेकिन यह भी कच्चे अनुरोध शरीर की जरूरत का उपयोग करना चाहते हैं इसके पढ़ने से पहले अनुरोध बफ़र होना, आप PreRequestFilter जोड़कर कर सकते हैं जो ServiceStack बताने के लिए:

appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => { 
    httpReq.UseBufferedStream = true; 
}); 

कौन सा अब आप httpReq.GetRawBody() कई बार फोन या के बाद से यह अब बफ़र है सीधे IHttpRequest.InputStream से पढ़ने की सुविधा देता है।

+0

यह पहले से ही कम है जो मैं पहले से कर रहा हूं लेकिन मुझे आईआरईटीपीआरक्वैस्ट से आईएचटीपीआरक्वेट प्राप्त करने के लिए प्रतिबिंब का उपयोग करना पड़ा जो मैं स्पष्ट कारणों से नहीं करना चाहता था। IServiceRunner के अंदर से IHttpRequest को पकड़ने का कोई तरीका है। विधि विधि? –

+1

प्रतिबिंब? अनुरोध प्राप्त करने के लिए बस 'requestContext.Get () 'प्राप्त करें। – mythz

+0

@mythz 'httpReq.UseBufferedStream = true;' उत्पादन में सुरक्षित है? या यह सामान्य रूप से अनुशंसित नहीं है? – vonec

संबंधित मुद्दे