2013-08-28 12 views
8

मैं अपने WPF अनुप्रयोग में एक वेब सेवा के लिए संवाद करने के लिए HttpClient कक्षा का उपयोग कर रहा हूं।सी #: एचटीपी क्लाइंट, सर्वर ने प्रोटोकॉल उल्लंघन किया। अनुभाग = ResponseStatusLine

जब मैं एक ही कनेक्शन पर लगातार जीईटी अनुरोध करता हूं, तो सब कुछ ठीक काम करता है। हालांकि, जब मैं एक ही कनेक्शन पर लगातार पुट/पैच अनुरोध करता हूं, तो पहला अनुरोध सही तरीके से निष्पादित करता है और मुझे एक प्रतिक्रिया प्राप्त होती है लेकिन दूसरे अनुरोध में अनुरोध में शरीर शामिल नहीं होता है और मुझे "प्रोटोकॉल करने वाले सर्वर" की कुख्यात त्रुटि प्राप्त होती है। उल्लंघन। खंड = प्रतिक्रिया स्थितिैटिन "।

कनेक्शन जोड़कर प्रत्येक अनुरोध के बाद मैन्युअल रूप से कनेक्शन बंद करने पर मेरे अनुरोध सफलतापूर्वक पूर्ण हो जाते हैं: शीर्षलेख पर बंद करें। यह "समाधान" एक खराब पैटर्न है और प्रदर्शन उचित पैमाने पर स्केल नहीं करेगा।

नीचे अनुरोध से मेरी टीसीपी स्ट्रीम आउटपुट की एक सूची की एक debranded संस्करण भेजा जा रहा है:

Wireshark: पालन टीसीपी स्ट्रीम आउटपुट

GET /domain/api/tenant/current/object?objectName=Lizbot HTTP/1.1 
Accept: application/json 

    HTTP/1.1 200 OK 
    Content-Type: application/json; charset=utf-8 
    Content-Length: 50 
    {"Data":[{"Id":123,"ObjectName":"Lizbot","Date":null}],"Errors":[]} 

PATCH /domain/api/tenant/current/object/123 HTTP/1.1 
Accept: application/json 
Content-Type: application/json; charset=utf-8 
Content-Length: 50 
{"Id":123,"ObjectName":"Lizbot","Date":null} 

    HTTP/1.1 204 No Content 
    Content-Type: application/json; charset=utf-8 
    {"Data":null,"Errors":[]} 

PATCH /domain/api/tenant/current/object/123/otherObject HTTP/1.1 
Accept: application/json 
Content-Type: application/json; charset=utf-8 

    HTTP/1.1 400 Bad Request</b> 
    Content-Type: text/html; charset=us-ascii 
    Connection: close 
    Content-Length: 311 

सूचना है कि दूसरी PATCH याद आ रही है ऑब्जेक्ट के साथ पैच करना चाहिए। अगर मैं पैचिंग के क्रम को बदलता हूं, तो दूसरा पैच अभी भी अपनी वस्तु खो रहा है।

यह त्रुटि कुछ ज्ञात समाधानों के साथ आम है जो मैंने कोशिश की है। उनमें this solution शामिल है जिसमें उपयोग UnsafeHeaderParsing प्रॉपर्टी को TRUE पर सेट करना और Keep-Alive प्रॉपर्टी को वेब पर FALSE पर सेट करना शामिल है। कॉनफिग। मैंने इन गुणों को नीचे दिखाए गए तरीके से सेट करने के समाधान की भी कोशिश की:

ServicePointManager.DefaultConnectionLimit = 2; 
ServicePointManager.Expect100Continue = false; 

इनमें से कोई भी समाधान काम नहीं करता है। यह ध्यान दिया जाना चाहिए कि इन अनुरोधों को कैप्चर करने के लिए एचटीपी डीबगिंग प्रॉक्सी टूल, फिडलर का उपयोग करते समय, मुझे कोई त्रुटि नहीं मिलती है।

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

उत्तर

6

अंतर्निहित समस्या यह है कि पैच प्रतिक्रिया में प्रतिक्रिया के शरीर में सामग्री शामिल होती है। सुनिश्चित करें कि 204 कोई सामग्री भेजने पर सर्वर सामग्री नहीं भेजता है।

+0

धन्यवाद! मैं इस जवाब को स्वीकार कर रहा हूं क्योंकि, हालांकि मेरा त्रुटि फेंकने से रोक देगा, यह सुनिश्चित करता है कि मुझे फेंकने में त्रुटियां नहीं हैं। –

+1

हालांकि मैं मानता हूं कि शरीर के साथ 204 भेजना एक प्रोटोकॉल उल्लंघन है, HttpClient बिना किसी समस्या के इस स्थिति को संभाल सकता है। जैसा कि स्वयं होस्टेड वेब एपीआई हो सकता है। शायद आईआईएस गड़बड़ चीजें। –

9

बहुत डीबगिंग और पढ़ने के बाद, मुझे एहसास हुआ कि मैं वेब संपादित करने की कोशिश कर रहा था। App.config फ़ाइल के बजाय WPF एप्लिकेशन की कॉनफिग फ़ाइल!

तो यदि आप इस कोड को एप.कॉन्फिग फ़ाइल में एक WPF अनुप्रयोग के लिए कॉन्फ़िगरेशन टैग की रूट पर ड्रॉप करते हैं, तो यह समस्या को हल करता है।

<system.net> 
<settings> 
<httpWebRequest useUnsafeHeaderParsing = "true"/> 
</settings> 
</system.net> 
संबंधित मुद्दे

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