यही स्थिति और त्रुटि भी डिफ़ॉल्ट विज़ार्ड उत्पन्न SOAP वेब सेवा प्रॉक्सी के साथ उत्पन्न हो सकती है (100% नहीं अगर यह WCF System.ServiceModel
स्टैक पर भी है ) रनटाइम पर:
- अंत उपयोगकर्ता मशीन कॉन्फ़िगर किया गया है (इंटरनेट सेटिंग्स में) एक प्रॉक्सी का उपयोग करने के लिए जो HTTP 1.1 को नहीं समझता है
- क्लाइंट एक ऐसी चीज भेजना समाप्त करता है जिसे HTTP 1.0 प्रॉक्सी समझ में नहीं आता (आमतौर पर
Expect
HTTP के भाग के रूप में एक हेडर 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 };
}
}