5

古い ASP.NET Web サービスを置き換えるために使用している WCF サービスがあります。サービスは正常に動作しているように見えますが、何らかの理由で同時リクエストを処理できません。私のサービスの実装には、次のプロパティがあります。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HHService : IHHService

私のホスト宣言は次のようになります。

baseAddress = new Uri("http://0.0.0.0:8888/HandHeld/");
host = new ServiceHost(typeof(HHService), baseAddress);

ServiceMetadataBehavior behavior;
behavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (behavior == null)
{
    behavior = new ServiceMetadataBehavior();
    behavior.HttpGetEnabled = true;
    behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    host.Description.Behaviors.Add(behavior);
}
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host.AddServiceEndpoint(typeof(IHHService), new BasicHttpBinding(), "HHService.asmx");
HHService.LogMessage += new EventHandler<HHService.LogMessageEventArgs>(HHService_LogMessage);
host.Open();

サービスが実行され、正しい結果が返されますが、2 つのクライアントが同時に呼び出しを行おうとすると、呼び出しが一緒に実行されるのではなく、一方のクライアントが他方のクライアントが終了するまでブロックされます。構成ファイルは使用していません。私はすべてをプログラムでやろうとしています。この動作を引き起こしている何かが正しく設定されていませんか? この問題なしで NetTCPBinding を使用して他のサービスを実行しました。

編集: John Saunders への回答: ASP.NET 互換モードについて詳しくありません。私はセッション状態を使用していません。サービスはステートレスで、リクエストを処理するだけです。実際のメソッドの実装は別として、私が行ったすべてのことは、ここにリストされたコードにあります。

考えられる解決策:

host.Open()メインフォームの form_load イベントから関数を呼び出していました。呼び出しを別のスレッドに移動しました。このスレッドが行ったのは呼び出しhost.Open()だけでしたが、サービスは期待どおりに動作しているようです。

4

4 に答える 4

4

インスタンス コンテキスト モードが PerCall の場合、サーバーは常にシングル スレッドです。これは、定義上、すべての呼び出しが新しいサーバー インスタンスを取得するためです。

これは、IIS 環境では問題なく動作します。IIS は複数のサーバー インスタンスをスピンアップして、n 個の同時呼び出し元を処理できます。それぞれのサーバー インスタンスは、着信要求ごとに 1 つずつシングル スレッド サーバーとして処理されます。

コメントの 1 つで、フォーム アプリ内で WCF をホストしていると述べています。これは、再検討する必要がある設計上の決定である可能性があります。Winforms アプリは複数の呼び出し元を簡単に処理できず、サービスの複数のインスタンスをスピンアップできないため、これは実際には最適ではありません。コード。

マルク

于 2009-06-17T16:52:58.100 に答える
0

ASP.NET互換モードを使用していますか?セッション状態?


私の次の質問は、それがシングルスレッドだと思わせる理由は何ですか?それをどのように判断し、問題を解決していないことを証明するためにどのようなテストを使用しますか?誤検知の可能性があります。

于 2009-06-17T14:15:53.187 に答える
0

これは別の質問で答えられます:

[ServiceBehavior(UseSynchronizationContext = false)]

WinformsアプリのWCF - 常にシングルスレッドですか?

于 2012-02-23T19:43:51.493 に答える
0

サービス機能のどこかにロックはありますか?

于 2009-06-17T14:12:05.473 に答える