古い 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()
だけでしたが、サービスは期待どおりに動作しているようです。