Cette même situation et l'erreur peut également être le cas avec un par défaut de l'assistant généré SAVON de proxy de Service Web (pas à 100% si c'est également le cas sur la WCF System.ServiceModel
pile) lorsqu'au moment de l'exécution:
- l'utilisateur de la machine est configuré dans les Paramètres Internet) pour utiliser un proxy qui ne comprennent pas HTTP 1.1
- le client finit par l'envoi de quelque chose qui un HTTP 1.0 proxy ne comprennent pas (souvent une
Expect
d'en-tête dans le cadre d'un HTTP POST
ou PUT
la demande en raison d'une norme de protocole de la convention de l'envoi de la demande, en deux parties, comme indiqué dans les Remarques ici)
... ce qui donne un 417.
Abordés dans les autres réponses, si le problème que vous rencontrer, c'est que l' Expect
- tête est à l'origine du problème, alors que problème spécifique peut être acheminé de façon à contourner en faisant un relativement mondial de l'arrêt du deux-partie PUT/POST transmission via System.Net.ServicePointManager.Expect100Continue
.
Toutefois, cela ne résout pas le terminer problème sous - jacent- la pile peut encore utiliser HTTP 1.1 choses spécifiques comme les connexions actives etc. (bien que, dans de nombreux cas, les autres réponses ne couvrent les principaux cas.)
Le réel problème est que le code généré automatiquement suppose que c'est OK pour aller aveuglément à l'aide de HTTP 1.1 installations comme tout le monde comprend cela. Pour arrêter cette hypothèse pour un proxy de Service Web, on peut changer de remplacer la valeur par défaut sous-jacent HttpWebRequest.ProtocolVersion
de la valeur par défaut de 1.1 par la création d'un dérivé de la classe Proxy qui remplace protected override WebRequest GetWebRequest(Uri uri)
comme indiqué dans ce post:-
public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
request.ProtocolVersion = HttpVersion.Version10;
return request;
}
}
(où MyWS
est le proxy de l'Ajouter une Référence Web assistant recraché à vous.)
Mise à JOUR: Voici une impl je suis une utilisation en production:
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 };
}
}