2009-05-18 15 views
10

के साथ "अपेक्षा: 100-जारी रखें" शीर्षलेख का समर्थन करना मैं एएसपी.नेट एमवीसी का उपयोग कर एक आरईएसटी एपीआई लागू कर रहा हूं, औरअनुरोध हेडर के अनुरोध के साथ थोड़ा स्टम्बलिंग ब्लॉक आया है एक पोस्ट बॉडीएएसपी.नेट एमवीसी

RFC 2616 कहा गया है कि:

Upon receiving a request which includes an Expect request-header field with the "100-continue" expectation, an origin server MUST either respond with 100 (Continue) status and continue to read from the input stream, or respond with a final status code. The origin server MUST NOT wait for the request body before sending the 100 (Continue) response. If it responds with a final status code, it MAY close the transport connection or it MAY continue to read and discard the rest of the request. It MUST NOT perform the requested method if it returns a final status code.

यह मेरे लिए लग रहा है जैसे मैं से पढ़ना जारी अनुरोध करने के लिए दो प्रतिक्रियाओं बनाने की जरूरत है, यानी इसे तुरंत भेजने के लिए एक HTTP 100 प्रतिक्रिया जारी की जरूरत है, और उसके बाद मूल अनुरोध धारा (यानी HttpContext.Request.InputStream) अनुरोध समाप्त किए बिना, और अंततः परिणामी स्थिति कोड भेजना (तर्क के लिए, मान लें कि यह 204 कोई सामग्री परिणाम नहीं है)।

तो, सवाल कर रहे हैं:

  1. एम आई विनिर्देश सही पढ़ना, कि मैं एक अनुरोध करने के लिए दो प्रतिक्रियाओं बनाने की जरूरत है?
  2. यह एएसपी.नेट एमवीसी में कैसे किया जा सकता है?

w.r.t. (2) मैं इनपुट धारा को पढ़ने के लिए आगे बढ़ने से पहले निम्नलिखित कोड का उपयोग कर की कोशिश की है ...

HttpContext.Response.StatusCode = 100; 
HttpContext.Response.Flush(); 
HttpContext.Response.Clear(); 

... लेकिन जब मैं अंतिम 204 स्थिति कोड सेट करने का प्रयास मैं त्रुटि मिलती है:

System.Web.HttpException: Server cannot set status after HTTP headers have been sent.

उत्तर

2

100-जारी आईआईएस द्वारा संभाला जाना चाहिए। क्या कोई कारण है कि आप इसे स्पष्ट रूप से करना चाहते हैं?

+0

नहीं - मैं इससे बचना चाहता हूं! मुझे एहसास नहीं हुआ कि आईआईएस बिना किसी हस्तक्षेप के इसे संभालेगा। –

+0

मुझे 100 वेब जारी रखने के साथ 'WebRequest' में एक बग का सामना करना पड़ा है। इसका उपयोग न करने का एक अच्छा कारण है। http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds

2

आईआईएस 100

जिसके अनुसार, कोई यह दो प्रतिक्रियाएं नहीं है संभालती है। HTTP में, जब अपेक्षा: 100-जारी संदेश संदेश शीर्षकों के हिस्से में आता है, तो ग्राहक को सामग्री भेजने से पहले प्रतिक्रिया प्राप्त होने तक प्रतीक्षा करनी चाहिए।

एएसपीनेट आर्किटेक्टेड के तरीके के कारण, आपके पास आउटपुट स्ट्रीम पर थोड़ा नियंत्रण नहीं है। धारा में लिखे गए किसी भी डेटा को स्वचालित रूप से 200 प्रतिक्रिया में डाल दिया जाता है जब भी आप फ्लश करते हैं, चाहे आप बफर किए गए मोड में हों या नहीं।

अफसोस की बात यह है कि यह सब सामान पूरी जगह पर आंतरिक तरीकों से छिपा हुआ है, और नतीजा यह है कि यदि आप एमवीसी के रूप में एएसपीनेट पर भरोसा करते हैं, तो आप इसे बाईपास करने में काफी असमर्थ हैं।

जब तक आप गैर-बफर किए गए तरीके से इनपुट स्ट्रीम को आजमाएं और एक्सेस न करें तब तक प्रतीक्षा करें। दर्द का एक पूरा भार।

एसईबी

15

डिफ़ॉल्ट रूप से नेट ढांचा हमेशा expect: 100-continue हैडर हर HTTP 1.1 पद के लिए भेजता है। यह व्यवहार प्रोग्राम के रूप में इतनी तरह System.Net.ServicePoint.Expect100Continue संपत्ति के माध्यम से अनुरोध के अनुसार नियंत्रित किया जा सकता है:

HttpWebRequest httpReq = GetHttpWebRequestForPost(); 
httpReq.ServicePoint.Expect100Continue = false; 

यह भी विश्व स्तर पर प्रोग्राम के रूप में नियंत्रित किया जा सकता:

...या विश्व स्तर पर विन्यास के माध्यम से:

<system.net> 
    <settings> 
    <servicePointManager expect100Continue="false"/> 
    </settings> 
</system.net> 

आप इस जानकारी के लिए लांस ओल्सन और Phil Haack धन्यवाद।

+0

मुझे सिस्टम.Net.ServicePointManager.Expect100Continue = false जोड़ने चाहिए; मेरे wp7 कोड में? – Apoorva

+1

मैंने WP7 के लिए कोई प्रोग्रामिंग नहीं किया है, लेकिन मुझे लगता है कि कोड App.xaml.cs में संभवतः एप्लिकेशन_लांचिंग या एप्लिकेशन_एक्टिव इवेंट हैंडलर में जाएगा। –

+0

यह सवाल का जवाब नहीं देता है ... –

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