HTTP POST रिटर्न्स त्रुटि: 417 "प्रत्याशित असफलता।"


212

जब मैं किसी URL को POST करने की कोशिश करता हूं तो इसके परिणामस्वरूप निम्न अपवाद होते हैं:

दूरस्थ सर्वर ने एक त्रुटि दी: (417) उम्मीद की असफलता।

यहाँ एक नमूना कोड है:

var client = new WebClient();

var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");

byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.

एक HttpWebRequest/HttpWebResponseजोड़ी का उपयोग करना या कोई HttpClientफर्क नहीं पड़ता।

इस अपवाद का कारण क्या है?


2
समस्या तब होती है जब आपका अनुप्रयोग प्रॉक्सी सर्वर के माध्यम से संचार करता है। एक .NET अनुप्रयोग मैंने लिखा था जब यह इंटरनेट से सीधे जुड़ा था, लेकिन तब नहीं जब यह एक प्रॉक्सी सर्वर के पीछे था।
सलमान एक

2
इस स्थिति का अवलोकन तब किया जाता है जब कोई क्लाइंट HTTP 1.0 (केवल) प्रॉक्सी सर्वर के माध्यम से चल रहा हो। क्लाइंट (किसी भी कॉन्फ़िगरेशन के बिना asmx प्रॉक्सी) एक HTTP 1.1 अनुरोध भेज रहा है और प्रॉक्सी (किसी भी सर्वर को कभी भी शामिल कर सकता है) से पहले तो वह प्रॉक्सी खारिज करता है जो प्रॉक्सी भेजता है। एंड-यूज़र के पास यह समस्या होनी चाहिए, नीचे दिए गए कॉन्फिग सॉल्यूशन का उपयोग करना एक उचित समाधान है क्योंकि यह Expectहेडर को समझने के बिना रिक्वेस्ट के उत्पन्न होने का अनुरोध करता है, जो कि डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप Expect100Continueसे जोड़ा जाता है true
बार्टेलिंक

जवाबों:


478

System.Net.HttpWebRequest हर अनुरोध में हेडर 'HTTP हेडर "उम्मीद: 100-जारी रखें" जोड़ता है जब तक कि आप स्पष्ट रूप से यह नहीं पूछते हैं कि इस स्थिर संपत्ति को झूठे द्वारा सेट न करें :

System.Net.ServicePointManager.Expect100Continue = false;

कुछ सर्वर उस हेडर पर चोक करते हैं और आपके द्वारा देखी जा रही 417 त्रुटि को वापस भेजते हैं।

एक गोली दे दो।


5
मेरे पास कुछ कोड थे जो ट्विटर पर बात करते थे कि अचानक क्रिसमस के बाद दिन काम करना बंद कर दिया। उन्होंने एक अपग्रेड या कॉन्फिग चेंज किया जिससे उनके सर्वर उस हेडर पर चोक करने लगे। यह फिक्स खोजने के लिए एक दर्द था।
xcud

8
मुझे लगता है कि जॉन स्केट ने एक समाधान में पोस्ट किए गए उत्तर को स्वीकार करने के लिए अतिरिक्त 10 अंक जुटाए।
xcud

1
धन्यवाद! यह एमएसडीएन
यूजीन

25
आप उस संपत्ति को अपने app.config में भी निर्दिष्ट कर सकते हैं: <system.net> <settings> <servicePointManager expect100Continue = "false" />। nahidulkibria.blogspot.com/2009/06/…
आंद्रे लुस

2
नोट: यह सेटिंग ServiceReferences पर भी लागू होती है और मुझे लगता है WebReferences।
मिस्टर

114

दूसरा रास्ता -

इन लाइनों को अपने एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल कॉन्फ़िगरेशन अनुभाग में जोड़ें:

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

6
बहुत अच्छी तरह से काम करता है जब आपको एक परिचालन परिवर्तन करना पड़ता है और एक कोड परिवर्तन के लिए तैयार नहीं होता है।
डेवबर

1
विन्यास की वह रेखा क्या करती है?
J86

31

यही स्थिति और त्रुटि भी डिफ़ॉल्ट विज़ार्ड उत्पन्न SOAP वेब सेवा प्रॉक्सी के साथ उत्पन्न हो सकती है (100% नहीं अगर यह WCF System.ServiceModelस्टैक पर भी है ) रनटाइम पर:

  • अंत उपयोगकर्ता मशीन कॉन्फ़िगर किया गया है (इंटरनेट सेटिंग्स में) एक प्रॉक्सी का उपयोग करने के लिए जो HTTP 1.1 को नहीं समझता है
  • क्लाइंट एक ऐसी चीज भेजना समाप्त करता है जिसे HTTP 1.0 प्रॉक्सी समझ में नहीं आता (आमतौर पर ExpectHTTP के भाग के रूप में एक हेडर POSTया PUTमानक प्रोटोकॉल कन्वेंशन के कारण अनुरोध को दो भागों में भेजने के रूप में यहां रिमार्क्स में शामिल किया गया है )

... एक 417 की उपज।

जैसा कि अन्य उत्तरों में कवर किया गया है, यदि आप जिस विशिष्ट मुद्दे को चलाते हैं, वह यह है कि Expectहेडर समस्या पैदा कर रहा है, तो उस विशिष्ट समस्या को दो-भाग PUT / POST ट्रांसमिशन के माध्यम से अपेक्षाकृत वैश्विक स्विचिंग बंद करके के आसपास रूट किया जा सकता है System.Net.ServicePointManager.Expect100Continue

हालांकि यह पूरी तरह से अंतर्निहित समस्या को ठीक नहीं करता है - स्टैक अभी भी HTTP 1.1 विशिष्ट चीजों जैसे कि KeepAlives आदि का उपयोग कर सकता है (हालांकि कई मामलों में अन्य उत्तर मुख्य मामलों को कवर करते हैं।)

हालांकि वास्तविक समस्या यह है कि ऑटोगेन्जेनेटेड कोड मानता है कि HTTP 1.1 सुविधाओं का उपयोग करके नेत्रहीन रूप से जाना ठीक है क्योंकि हर कोई इसे समझता है। एक विशिष्ट वेब सेवा प्रॉक्सी के लिए इस धारणा को रोकने के लिए, एक 1.1HttpWebRequest.ProtocolVersion से डिफ़ॉल्ट से अंतर्निहित डिफ़ॉल्ट को ओवरराइड करके एक अलग प्रॉक्सी क्लास बना सकता है, जो इस पोस्ट में दिखाए गए अनुसार ओवरराइड कर सकता है : -protected override WebRequest GetWebRequest(Uri uri)

public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
      HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
      request.ProtocolVersion = HttpVersion.Version10;
      return request;
    }
}

(जहां MyWSआप पर वेब संदर्भ विज़ार्ड जोड़ें प्रॉक्सी प्रॉक्सी है।)


अद्यतन: यहाँ एक अनुमान है कि मैं उत्पादन में उपयोग कर रहा हूँ:

class ProxyFriendlyXXXWs : BasicHttpBinding_IXXX
{
    public ProxyFriendlyXXXWs( Uri destination )
    {
        Url = destination.ToString();
        this.IfProxiedUrlAddProxyOverriddenWithDefaultCredentials();
    }

    // Make it squirm through proxies that don't understand (or are misconfigured) to only understand HTTP 1.0 without yielding HTTP 417s
    protected override WebRequest GetWebRequest( Uri uri )
    {
        var request = (HttpWebRequest)base.GetWebRequest( uri );
        request.ProtocolVersion = HttpVersion.Version10;
        return request;
    }
}

static class SoapHttpClientProtocolRealWorldProxyTraversalExtensions
{
    // OOTB, .NET 1-4 do not submit credentials to proxies.
    // This avoids having to document how to 'just override a setting on your default proxy in your app.config' (or machine.config!)
    public static void IfProxiedUrlAddProxyOverriddenWithDefaultCredentials( this SoapHttpClientProtocol that )
    {
        Uri destination = new Uri( that.Url );
        Uri proxiedAddress = WebRequest.DefaultWebProxy.GetProxy( destination );
        if ( !destination.Equals( proxiedAddress ) )
            that.Proxy = new WebProxy( proxiedAddress ) { UseDefaultCredentials = true };
    }
}

2
मुझे पता है कि आपने इसे कुछ समय पहले पोस्ट किया था, लेकिन रूबेन, आप एक जीवन रक्षक हैं। यह मुद्दा मुझे पागल कर रहा है जब तक कि मैं आपके समाधान में नहीं आया और यह पूरी तरह से काम करता है। चीयर्स!
क्रिस्टोफर मैकऐटकी

1
@ChrisMcAtackney आपका स्वागत है। यह निश्चित रूप से उन पर इसे दर्ज करने के प्रयास के लायक लग रहा था ... सामान्य मुद्दा शीर्ष प्राथमिकता वाले मुद्दे बनने के चारों ओर सेट था और बस मुझे परेशान किया जब तक कि मैंने इसे ठीक से जांच नहीं की - फिर भी वहाँ कोई Google रस नहीं लगता मुद्दे का वह पक्ष। और यह एक तरह से अटवुड चेप के पोस्ट में से एक था जिसने मुझे ऐसा करने के लिए प्रेरित किया। (इस तरह की एक टिप्पणी के साथ एक
उत्थान

1
अद्भुत जोड़ और उदाहरण। धन्यवाद!
फादी चमिह

5

क्या आप जिस फॉर्मूले का अनुकरण करने की कोशिश कर रहे हैं, उसके दो फ़ील्ड हैं, उपयोगकर्ता नाम और पासवर्ड?

यदि हां, तो यह लाइन:

 postData.Add("username", "password");

सही नहीं है।

आपको दो लाइनों की आवश्यकता होगी जैसे:

 postData.Add("username", "Moose");
postData.Add("password", "NotMoosespasswordreally");

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

ठीक है, चूंकि यह समस्या नहीं है, इसलिए इससे निपटने का एक तरीका यह है कि फ़िडलर या विरेशर जैसे कुछ का उपयोग करके यह देखें कि ब्राउज़र से वेब सर्वर पर क्या भेजा जा रहा है, फिर इसकी तुलना करें कि आपके कोड से क्या भेजा जा रहा है। यदि आप .Net से एक सामान्य पोर्ट 80 पर जा रहे हैं, तो फ़िडलर अभी भी इस ट्रैफ़िक को कैप्चर करेगा।

प्रपत्र पर कुछ अन्य छिपे हुए फ़ील्ड हैं जो वेब सर्वर को उम्मीद है कि आप नहीं भेज रहे हैं।


3

प्रॉक्सी पक्ष से समाधान, मुझे एसएसएल हैंडशेक प्रक्रिया में कुछ समस्याओं का सामना करना पड़ा और मुझे अपने प्रॉक्सी सर्वर को HTTP / 1.0 का उपयोग करके अनुरोध भेजने के लिए मजबूर SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1करना पड़ा क्योंकि httpd.conf में इस तर्क को सेट करके समस्या को हल करने के लिए मैंने 417 त्रुटि का सामना किया। मेरे क्लाइंट एप्लिकेशन HTTP / 1.1 का उपयोग कर रहे थे और प्रॉक्सी को HTTP / 1.0 का उपयोग करने के लिए मजबूर किया गया था RequestHeader unset Expect early, क्लाइंट के पक्ष में कुछ भी बदलने की आवश्यकता के बिना प्रॉक्सी पर httpd.conf में इस पैरामीटर को सेट करके समस्या हल हो गई थी , आशा है कि यह मदद करता है ।



1

यदि आप " HttpClient " का उपयोग कर रहे हैं , और आप अपने द्वारा उपयोग किए जाने वाले सभी प्रोग्राम को प्रभावित करने के लिए वैश्विक कॉन्फ़िगरेशन का उपयोग नहीं करना चाहते हैं:

 HttpClientHandler httpClientHandler = new HttpClientHandler();
 httpClient.DefaultRequestHeaders.ExpectContinue = false;

मैं आपको " WebClient " का उपयोग कर रहा हूं, मुझे लगता है कि आप कॉल करके इस हेडर को हटाने की कोशिश कर सकते हैं:

 var client = new WebClient();
 client.Headers.Remove(HttpRequestHeader.Expect);

0

मेरी स्थिति में, यह त्रुटि तभी होती है जब मेरे क्लाइंट के कंप्यूटर में एक सख्त फ़ायरवॉल नीति होती है, जो मेरे प्रोग्राम को वेब सेवा के साथ संचार करने से रोकती है।

तो केवल समाधान मैं पा सकता हूं त्रुटि को पकड़ना और उपयोगकर्ता को फ़ायरवॉल सेटिंग्स को मैन्युअल रूप से बदलने के बारे में सूचित करना।


-1

InfoPath प्रपत्र सेवाओं के लिए web.config अप्रोच इंटैप वेब सेवा सक्षम नियमों के लिए कॉल करता है।

  <system.net>
    <defaultProxy />
    <settings> <!-- 20130323 bchauvin -->
        <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>

2
के dup stackoverflow.com/a/7358457/11635 कृपया वहाँ टिप्पणी आप एक बिंदु जोड़ना चाहते हैं
रूबेन Bartelink
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.