これと同じような状況とエラーはまた、デフォルトのウィザード生成されたSOAP Webサービスプロキシで発生する可能性がある(ありませんWCF System.ServiceModel
スタックの場合も100%)実行時:
- エンドユーザーHTTP 1.1を理解していないプロキシを使用するように(インターネット設定で)設定されています
- HTTP 1.0プロキシが理解できないものをクライアントが送信します(一般に
POST
またはPUT
要求の一部としてExpect
ヘッダー)。要求を2つの部分に送信する標準的なプロトコルの慣習に変更する。as covered in the Remarks here
... 417を生成する。
Expect
ヘッダーが原因で問題が発生した場合は、2つの部分からなるPUT/System.Net.ServicePointManager.Expect100Continue
によるPOST送信
しかし、これは完全な根本的な問題が解決しない - (多くの場合、他の回答には、メインケースをカバーんが。)スタックは、まだなどキープアライブなどのHTTP 1.1の特定のものを使用している可能性があり
をしかし実際の問題は、自動生成されたコードでは、誰もが理解しているように、HTTP 1.1の機能を使って盲目的に行くことができると仮定しているということです。 MyWS
がプロキシである
public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
request.ProtocolVersion = HttpVersion.Version10;
return request;
}
}
( - :特定のWebサービスプロキシのこの仮定を停止するには、一つはprotected override WebRequest GetWebRequest(Uri uri)
as shown in this postをオーバーライドする派生プロキシクラスを作成することによって、1.1のデフォルトからHttpWebRequest.ProtocolVersion
の基礎となるデフォルトを上書き変更することができますWeb参照ウィザードはあなたに吐き出し追加)
UPDATEを:。
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 };
}
}
:ここで私は生産に使用している独自の実装があります
アプリケーションがプロキシサーバー経由で通信するときに問題が発生しているようです。私が書いた.NETアプリケーションは、インターネットに直接接続されていても、プロキシサーバーの背後にあったときには機能しませんでした。 –
クライアントがHTTP 1.0(のみ)プロキシサーバーを実行しているときにこの条件を確認します。クライアント(構成を持たないasmxプロキシ)がHTTP 1.1要求を送信していて、プロキシがサーバーに参加する前にプロキシが送信した内容を拒否します。エンドユーザーがこの問題を抱えている場合、[config solution below](http://stackoverflow.com/a/7358457/11635)を使用すると、プロキシの理解に依存せずにリクエストが生成されるため、適切な回避策ですデフォルトでは 'Expect100Continue'として追加される' Expect'ヘッダはデフォルトで 'true'です。 –