为什么Winforms托管的WCF服务是单线程的?

Myk*_*oft 5 c# wcf basichttpbinding winforms

我有一个WCF服务,用于替换旧的ASP.NET Web服务。该服务似乎运行正常,但由于某种原因无法处理同时请求。我对服务的实现具有以下属性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HHService : IHHService
Run Code Online (Sandbox Code Playgroud)

我的主机声明如下:

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();
Run Code Online (Sandbox Code Playgroud)

该服务将运行并返回正确的结果,但是如果两个客户端尝试同时进行呼叫,则一个客户端将阻塞直到另一个客户端完成,而不是一起执行呼叫。我没有使用任何配置文件。我正在尝试以编程方式进行所有操作。我是否有某些错误设置导致此行为?我已经使用NetTCPBinding运行了其他服务,而没有出现此问题。

编辑: 回应约翰·桑德斯:我不熟悉任何ASP.NET兼容模式。我没有使用任何会话状态,该服务是无状态的,它只是处理请求。除了实现实际方法之外,我所做的所有其他事情都在此处列出的代码中。

可能的解决方案:

host.Open()从主窗体的form_load事件调用该函数。我将调用移到一个单独的线程。所有这些线程所做的只是调用,host.Open()但现在该服务的行为似乎与我期望的一样。

mar*_*c_s 4

如果您的实例上下文模式是 PerCall,那么您的服务器始终是单线程的,因为根据定义,每个调用都会获取一个新的服务器实例。

这在 IIS 环境中工作正常,其中 IIS 可以启动多个服务器实例来处理 n 个并发调用者,每个调用者作为每个传入请求的单线程服务器。

您在评论中提到您在表单应用程序中托管 WCF - 这可能是您需要重新考虑的设计决策 - 这并不是真正的最佳选择,因为 Winforms 应用程序无法轻松处理多个调用者并启动服务的多个实例代码。

马克