0

私のアプリケーションは、WCFサービスを使用するC#Windowsサービスです。最初の「期待に失敗しました(417)」エラーが発生したとき、両方ServicePointManager.Expect100ContinueServicePoint.Expect100Continueを次のように変更しfalseます。

try
{
    //ServicePointManager.Expect100Continue = false; // If uncomment all work
    var svc = new ServiceClient();
    svc.GetData(); // first error
}
catch (ProtocolException pex)
{
    if (pex.Message.Contains("(417)"))
    {
        ServicePointManager.Expect100Continue = false;
        var sp = ServicePointManager.FindServicePoint(new Uri(@"http://addr.to.service/service.svc"));
        sp.Expect100Continue = false;

        var svc = new ServiceClient();
        svc.GetData(); // second same error
    }
}

ただし、サービスへの2番目の呼び出しも失敗します。ただし、接続前に設定Expect100Continueするfalseと、サービスとの通信は正常に機能します。

Expect100Continueこの方法でエラーを正しく処理できますか?アプリケーションがユーザーの操作なしで自動的に適応する必要があります。この仕事をするのを忘れているのは何ですか?

4

2 に答える 2

1

の設定のほとんどはServicePointManager、アプリケーションの存続期間のその時点以降に作成されるすべての新しいServicePointに適用されるデフォルト値として扱われます。エラーが表示された後に設定を変更した場合、この場合はWCFによって使用される接続に関連付けられたインスタンスを含め、既存のServicePointインスタンスでは実際には何も変更されていません。

サンプルコードでServicePointManager.FindServicePoint、正しいServicePointを見つけようとしています。ただし、FindServicePointいくつかのオーバーロードがあり、そのAPIを誤って使用するのは簡単です。たとえば、FindServicePointhttp / https、接続しているホスト、プロキシ構成などを考慮に入れようとします。に正しいパラメータを指定しないとFindServicePoint、間違ったServicePointが返され、設定は、変更しようとしたものには適用されませんServicePoint

私はあなたが正しいことを確実にするためにFindServicePointかかる過負荷を使用することをお勧めします。ほとんどの場合、オブジェクトとして渡すことができるはずです。IWebProxy objectServicePointWebRequest.DefaultWebProxyIWebProxy

于 2012-09-17T18:23:58.620 に答える
0

ServicePointManager.Expect100ContinueのMSDNドキュメントから、

このプロパティの値を変更しても、既存のServicePointオブジェクトには影響しません。変更後に作成された新しいServicePointオブジェクトのみが影響を受けます。したがって、既存のWCFクライアントの値を変更しても効果はありません。新しいWCFクライアントを作成してから、GetData()を呼び出す必要があります

于 2013-02-05T17:21:07.583 に答える