4

現在、.NET 4.5 と 4.0 で WPF/WCF クライアント アプリケーションをテストしており、最終的に 4.5 をすべてのクライアント マシンに展開することを目指しています。WCF 部分は BasicHttpBinding/SOAP を使用します。

同じ条件 (Win7 など) で 2 つのクライアント バージョンをテストすると、SOAP サーバー エンドポイントへの「新しい TCP 接続」が 10 倍に増加しました。リモート サーバーに接続しているため、新しい TCP 接続を確立すると Web サービス呼び出しに大きな遅延が追加されるため、これは面倒です。

4.0 を使用する場合、以前にクライアントServicePointManager設定を調整して TCP 接続の再利用を最大化し、これらの設定が 4.5 に適用されることを期待していました。

私のアプリケーションは通常、一度に 1 つの呼び出しを実行します。平均すると、おそらく 10 秒ごとに、数分ごとに 10 の同時呼び出しのバーストが発生します。

変更ログを確認しましたが、.NET のこの部分に加えられた修正/変更への参照が見つかりません。ここで何が起こっているのか、誰かに光を当てることができますか?

ServicePointManager.UseNagleAlgorithm = true;
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 50;
ServicePointManager.MaxServicePointIdleTime = 10000;

Binding binding = new BasicHttpBinding
{
    SendTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
    ReceiveTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
    MaxReceivedMessageSize = 1024 * 1024 * 10,
    MaxBufferSize = 1024 * 1024 * 10,
    MaxBufferPoolSize = 1024 * 1024 * 100,
    Security =
        {
            Mode = BasicHttpSecurityMode.TransportCredentialOnly,
            Message = { ClientCredentialType = BasicHttpMessageCredentialType.UserName },
            Transport = { ClientCredentialType = HttpClientCredentialType.Basic },
        },
};
4

2 に答える 2

3

これは、別の問題を修正するときに導入された回帰によるものです。これは、サーバーからのチャンク化された Transfer-Encoding 応答に関連しています。

HttpWebRequest を直接使用している場合は、アプリケーションが応答ストリーム全体を確実に読み取るようにすることで、この問題を回避できます。これは、読み取ったバイト数として 0 が返されるまで、ストリームで Read または BeginRead メソッドを呼び出す必要があることを意味します。

WCF のようなラッピング テクノロジを使用している場合、クライアント側で既知の回避策はありません。サーバーにアクセスできる場合は、サーバーを変更して、チャンク応答ではなくコンテンツ長ベースの応答を送信できます。これにより、クライアントで問題のあるコード パスを回避できます。

この問題の修正が確認されており、今後のフレームワークの更新で広くリリースされる予定です。これがブロックされている場合は、Microsoft カスタマー サポートにお問い合わせください。

于 2013-05-22T16:58:26.427 に答える
0

この問題は、次のホットフィックスで修正されています。

Win7: http://support.microsoft.com/kb/2846044 Win8: http://support.microsoft.com/kb/2846046

Win7 パッチが機能していることを確認しました。

于 2013-07-09T15:09:05.003 に答える