【问题标题】:Why is my Winforms-hosted WCF service single threaded?为什么我的 Winforms 托管的 WCF 服务是单线程的?
【发布时间】:2009-06-17 14:10:07
【问题描述】:

我有一个 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 兼容模式。我没有使用任何会话状态,该服务是无状态的,它只是处理请求。除了实际方法的实现之外,我所做的其他一切都在此处列出的代码中。

可能的解决方案:

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

【问题讨论】:

    标签: c# winforms wcf basichttpbinding


    【解决方案1】:

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

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

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

    马克

    【讨论】:

    • 请看看我的编辑,因为我确实让它工作正常,除了我提到的那些之外没有做任何其他更改。我不确定它为什么会起作用。
    • 好的,很好。是的,在主 UI 线程上的 Winforms 应用程序中托管 WCF 服务并不是一个好主意。
    • 这很奇怪,因为我有另一个应用程序使用 NetTCPBinding 做几乎相同的事情,而且它没有这些问题。
    【解决方案2】:

    您的服务功能中是否有锁?

    【讨论】:

      【解决方案3】:

      您使用的是 ASP.NET 兼容模式吗?会话状态?


      我的下一个问题是:是什么让您认为它是单线程的?你是如何确定的,你用什么测试来证明你没有解决这个问题?可能是误报。

      【讨论】:

        【解决方案4】:

        这是另一个问题的答案:

        [ServiceBehavior(UseSynchronizationContext = false)]
        

        WCF in Winforms app - is it always single-threaded?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-29
          • 1970-01-01
          • 2011-02-19
          • 1970-01-01
          • 2012-09-07
          • 2015-05-13
          • 1970-01-01
          相关资源
          最近更新 更多