HTTPポストを返すエラー:417"への期待に失敗しました。"
質問
しようポストへのURLが結果として以下の例外:
しかし、リモートサーバに返されるエラー:(417)の期待に失敗しました。
こちらのサンプルコード:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
を使用 HttpWebRequest/HttpWebResponse
ペアまたは HttpClient
います。
何がこの例外?
解決
システム。います。HttpWebRequest追加しますヘッダ'HTTPヘッダの"期待:100を継続する"をあらゆるご要望におない限り、明示的にお願いではないに設定 この静的財産 false:
System.Net.ServicePointManager.Expect100Continue = false;
一部のサーバーチョークとヘッダおよび返送の417エラーだなと思います。
することができるシュートを放ちます。
他のヒント
別の方法 -
、アプリケーションの設定ファイルの構成セクションに次の行を追加します。
<system.net>
<settings>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
この状況やエラーも生じるデフォルトのウィザードを生成SOAPのWebサービスプロキシ(100%の場合この場合も、WCF System.ServiceModel
スタック)でランタイム:
- 、エンドユーザー機構をインターネット設定"の"プロキシサーバーを利用することは理解できないHTTP1.1
- トの終了まで送っHTTP1.0プロキシのだが、理解し般的に非常に時間がかかる
Expect
ヘッダの一環として、HTTPPOST
またはPUT
の要請により標準プロトコル条約のリクエストを送信する二つの部品 対象として含まれているとのこちら)
...収量は、417.
対象として含まれているとの回答の場合、特定の問題まで、 Expect
ヘッダーの問題、その特有の問題で送られ周りをすることによって比較的グローバルスイッチングオフ時に二つの部分かれる郵送 System.Net.ServicePointManager.Expect100Continue
.
しかしな修正を完全に元の問題をスタックのことではなHTTP1.1特定のものなどKeepAlives。も多くの場合、その他の回答いカバーの例です。)
実際の問題は、しかし、autogeneratedコードはでに行く際のHTTP1.1施設として皆様を理解します。この想定のための特定のWebサービスプロキシは、変更できるオーバーライドのデフォルトの裏付 HttpWebRequest.ProtocolVersion
デフォルト値からの 1.1 成由来のプロキシクラスでオーバーライド 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
のプロキシの追加ウェブ参照ウィザードにつばを吐出しありがとうございます。)
更新:を参照してください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 };
}
}
あなたがエミュレートしようとしているフォームは二つのフィールド、ユーザ名とパスワードを持っていますか?
もしそうなら、この行:
postData.Add("username", "password");
正しくありません。
あなたのような2行が必要になります:
postData.Add("username", "Moose");
postData.Add("password", "NotMoosespasswordreally");
編集ます:
それは問題ではありませんので、さて、これに対処する一つの方法は、あなたから送信されているものと比較することが、成功したブラウザからWebサーバに送信されているものを見るためにバイオリンやWiresharkのようなものを使用することですコード。あなたはネットからの通常のポート80に行くされている場合は、フィドラーはまだこのトラフィックをキャプチャします。
ウェブサーバーが送信されていないことを期待していることをフォーム上の他のいくつかの隠しフィールドは、おそらくあります。
ソリューション、私は、SSLハンドシェイクプロセスでいくつかの問題に直面し、私は、httpd.conf SetEnv force-proxy-request-1.0 1
でこの引数を設定することで、問題を解決するために、HTTP / 1.0を使用して要求を送信するために私のプロキシサーバを強制しなければなりませんでした
私のクライアントアプリケーションは、HTTP / 1.1を使用していたし、プロキシがHTTP / 1.0を使用することを余儀なくされた、問題をする必要なしに、プロキシ側SetEnv proxy-nokeepalive 1
にhttpd.confでこのパラメータを設定することで解決したとして、私は417エラーを向く後RequestHeader unset Expect early
これが役に立てば幸い、クライアント側では何も変更します。
PowerShell用のそれは
[System.Net.ServicePointManager]::Expect100Continue = $false
ご利用の場合"HttpClient"られないときには、いくつかを利用したいグローバル設定に影響を及ぼすプログラムを使用でき
HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClient.DefaultRequestHeaders.ExpectContinue = false;
私の使"WebClient"と思いを試すことができますこのヘッダを呼び出し:
var client = new WebClient();
client.Headers.Remove(HttpRequestHeader.Expect);
私の状況では、このエラーは私のクライアントのコンピュータは、Webサービスとの通信から私のプログラムを防ぎ、厳格なファイアウォールポリシーを持っている場合にのみ発生するようです。
だから私は見つけることができる唯一の解決策は、エラーをキャッチし、手動でファイアウォールの設定を変更する方法についてユーザーに通知することです。
のweb.configアプローチはIntApp Webサービスが有効ルールにInfoPathフォームサービス呼び出しのために働くます。
<system.net>
<defaultProxy />
<settings> <!-- 20130323 bchauvin -->
<servicePointManager expect100Continue="false" />
</settings>
</system.net>