Aynı durum ve hata System.ServiceModel
, çalışma zamanında varsayılan bir sihirbaz tarafından oluşturulan SOAP Web Hizmeti proxy'si (WCF yığınında da durum böyle ise% 100 değil) ile ortaya çıkabilir :
- son kullanıcı makinesi (İnternet Ayarlarında) HTTP 1.1'i anlamayan bir proxy kullanacak şekilde yapılandırılmıştır
- istemci, HTTP 1.0 proxy'sinin anlamadığı bir şey gönderir (genellikle buradaki Açıklamalar bölümünde açıklandığı gibi isteği iki bölüm halinde göndermek için standart bir protokol kuralı nedeniyle
Expect
bir HTTP POST
veya PUT
isteğin bir parçası olarak bir başlık )
... 417 veriyor.
Diğer cevaplarda da belirtildiği gibi, karşılaştığınız belirli bir sorun Expect
başlıkta soruna neden oluyorsa, söz konusu sorun, iki parçalı PUT / POST iletiminin göreceli olarak küresel bir şekilde kapatılmasıyla giderilebilir System.Net.ServicePointManager.Expect100Continue
.
Ancak bu, altta yatan sorunun tamamını çözmez - yığın hala KeepAlives vb.Gibi HTTP 1.1'e özgü şeyler kullanıyor olabilir (ancak çoğu durumda diğer cevaplar ana vakaları kapsar).
Ancak asıl sorun, otomatik olarak oluşturulan kodun, herkesin anladığı gibi HTTP 1.1 olanaklarını körü körüne kullanmanın uygun olduğunu varsaymasıdır. Belirli bir Web Hizmeti proxy'si için bu varsayımı durdurmak için, bu yayında gösterildiği gibi geçersiz kılınan türetilmiş bir Proxy sınıfı oluşturarak varsayılanın altında yatan HttpWebRequest.ProtocolVersion
varsayılan değer olan 1.1'i geçersiz kılabilirsiniz : -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
Web Referansı Ekleme sihirbazının size tükettiği proxy nerede .)
GÜNCELLEME: İşte üretimde kullandığım bir impl:
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 };
}
}