Dieselbe Situation und dieser Fehler können auch bei einem vom Standardassistenten generierten SOAP-Webdienst-Proxy (nicht 100%, wenn dies auch auf dem WCF- System.ServiceModel
Stapel der Fall ist ) zur Laufzeit auftreten:
- Der Endbenutzercomputer ist (in den Interneteinstellungen) so konfiguriert, dass er einen Proxy verwendet, der HTTP 1.1 nicht versteht
- Der Client sendet am Ende etwas, das ein HTTP 1.0-Proxy nicht versteht (normalerweise ein
Expect
Header als Teil eines HTTP POST
oder einer PUT
Anforderung aufgrund einer Standardprotokollkonvention zum Senden der Anforderung in zwei Teilen, wie in den Anmerkungen hier beschrieben ).
... ergibt eine 417.
Wie in den anderen Antworten beschrieben, kann das spezifische Problem, wenn Sie darauf stoßen, dass der Expect
Header das Problem verursacht, durch ein relativ globales Abschalten der zweiteiligen PUT / POST-Übertragung über umgeleitet werden System.Net.ServicePointManager.Expect100Continue
.
Dies behebt jedoch nicht das vollständige zugrunde liegende Problem - der Stack verwendet möglicherweise immer noch HTTP 1.1-spezifische Dinge wie KeepAlives usw. (obwohl in vielen Fällen die anderen Antworten die Hauptfälle abdecken.)
Das eigentliche Problem ist jedoch, dass der automatisch generierte Code davon ausgeht, dass es in Ordnung ist, HTTP 1.1-Funktionen blind zu verwenden, da dies jeder versteht. Um diese Annahme für einen bestimmten Webdienst-Proxy zu beenden, können Sie die Überschreibung der zugrunde liegenden Standardeinstellung HttpWebRequest.ProtocolVersion
von der Standardeinstellung 1.1 ändern, indem Sie eine abgeleitete Proxy-Klasse erstellen, die wie in diesem Beitrag gezeigt überschreibt : -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;
}
}
(Wo MyWS
ist der Proxy, den der Assistent zum Hinzufügen von Webreferenzen auf Sie ausgespuckt hat?)
UPDATE: Hier ist ein Gerät, das ich in der Produktion verwende:
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 };
}
}