c# - 为什么我的 Winforms 托管的 WCF 服务是单线程的?

标签 c# winforms wcf basichttpbinding

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

[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();

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

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

可能的解决方案:

我从主窗体的 form_load 事件调用 host.Open() 函数。我将调用移至单独的线程。此线程所做的只是调用 host.Open(),但现在该服务的行为似乎符合我的预期。

最佳答案

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

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

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

马克

关于c# - 为什么我的 Winforms 托管的 WCF 服务是单线程的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007279/

相关文章:

c# - 通用化对象初始化的更好方法?

c# - HttpStatusCode 是任何 500 类型

c# - 为什么这个 LINQ 抛出 "FormatException was unhandled"?

c# - 找不到类型 'Track_Attack.TAGeneric' 的构造函数。 C# 窗体

c# - 在 WPF 应用程序中使用远程数据库的建议方法是什么

c# - WCF 中端点的基地址

c# - 从数据库登录

vb.net - My.Computer.Audio.Play VB.NET是否有超过3个重载

c# - 如何使用 TableAdapter 进行更新?

wcf - Protobuf net 在使用 WCF 时不序列化