私は古い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()
と呼ばれていましたが、サービスが期待通りに動作しているように見えます。
私が編集したものを見てください。なぜなら、私が言及したもの以外の変更を加えずにうまく動作するからです。なぜそれが働いたのか分かりません。 – Mykroft
OK、excellent。はい、メインのUIスレッドでWinformsアプリケーション内でWCFサービスをホストすることは本当に素晴らしいアイデアではありません。 –
私はNetTCPBindingでほとんど同じことをする別のアプリを持っているので、これは変です。これらの問題がなければ動作します。 – Mykroft