Tình huống và lỗi tương tự này cũng có thể xảy ra với trình hướng dẫn mặc định được tạo proxy SOAP Web Service (không phải 100% nếu đây cũng là trường hợp trên System.ServiceModel
ngăn xếp WCF ) khi chạy:
- máy người dùng cuối được định cấu hình (trong Cài đặt Internet) để sử dụng proxy không hiểu HTTP 1.1
- khách hàng cuối cùng đã gửi một cái gì đó mà proxy HTTP 1.0 không hiểu (thường là một
Expect
tiêu đề như một phần của HTTP POST
hoặc PUT
yêu cầu do một quy ước giao thức chuẩn gửi yêu cầu thành hai phần như được nêu trong phần Ghi chú ở đây )
... mang lại một con số 417.
Như được đề cập trong các câu trả lời khác, nếu vấn đề cụ thể mà bạn gặp phải là Expect
tiêu đề đang gây ra sự cố, thì vấn đề cụ thể đó có thể được giải quyết bằng cách tắt chuyển PUT / POST hai phần tương đối toàn cầu System.Net.ServicePointManager.Expect100Continue
.
Tuy nhiên, điều này không khắc phục được vấn đề tiềm ẩn hoàn toàn - ngăn xếp vẫn có thể đang sử dụng những thứ cụ thể HTTP 1.1 như KeepAlives, v.v. (mặc dù trong nhiều trường hợp, các câu trả lời khác không bao gồm các trường hợp chính.)
Tuy nhiên, vấn đề thực tế là mã được tạo tự động giả định rằng bạn có thể sử dụng các phương tiện HTTP 1.1 một cách mù quáng vì mọi người đều hiểu điều này. Để dừng giả định này đối với proxy Dịch vụ web cụ thể, người ta có thể thay đổi ghi đè mặc định bên dưới HttpWebRequest.ProtocolVersion
từ mặc định 1.1 bằng cách tạo lớp Proxy dẫn xuất ghi đè như trong bài đăng này : -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;
}
}
(nơi mà MyWS
proxy của trình hướng dẫn Thêm tham chiếu web nhổ vào bạn.)
CẬP NHẬT: Đây là một impl tôi đang sử dụng trong sản xuất:
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 };
}
}