2009-06-17 5 views
4

私は古いASP.NET Webサービスを置き換えるために使用しているWCFサービスを持っています。サービスは正常に動作しているようですが、何らかの理由で同時要求を処理できません。サービスの私の実装では、次のプロパティがありますWinformsでホ​​ストされている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を使って他のサービスを実行しました。

編集:ジョン・サンダースに対応して : 私は任意のASP.NET互換モードに慣れていませんよ。セッション状態を使用していないので、サービスはステートレスなのでリクエストを処理するだけです。実際のメソッドの実装を除いて、私がやったことは他にもここに挙げたコードにあります。

考えられる解決策:

私は、メインフォームのForm_Loadイベントからhost.Open()関数を呼び出しました。私は別のスレッドに呼び出しを移動しました。このスレッドはすべてhost.Open()と呼ばれていましたが、サービスが期待通りに動作しているように見えます。

答えて

4

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

これは、IISがn個の同時呼び出し元を処理する複数のサーバーインスタンスをスピンアップできるIIS環境で正常に機能します。各呼び出し元は、着信要求ごとに1つのシングルスレッドサーバーとして処理されます。

WinFormsアプリケーションで複数の発信者を簡単に処理できず、いくつかのスピンアップを行うことができないため、これはフォームのアプリ内でWCFをホストしているコメントの1つで、再考する必要があります。サービスコードのインスタンス

マルク・

+0

私が編集したものを見てください。なぜなら、私が言及したもの以外の変更を加えずにうまく動作するからです。なぜそれが働いたのか分かりません。 – Mykroft

+0

OK、excellent。はい、メインのUIスレッドでWinformsアプリケーション内でWCFサービスをホストすることは本当に素晴らしいアイデアではありません。 –

+0

私はNetTCPBindingでほとんど同じことをする別のアプリを持っているので、これは変です。これらの問題がなければ動作します。 – Mykroft

0

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

+0

いいえロックがありません。 – Mykroft

0

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


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

関連する問題