【问题标题】:Service proxy freezes application服务代理冻结应用程序
【发布时间】:2012-03-12 23:32:06
【问题描述】:

这是我遇到的一个我完全不知道的问题。我已经定义了一个 IWorkerServiceContract 类,如下:

[ServiceContract]
public interface IWorkerServiceContract
{
    [OperationContract]
    int Test(int test);
}

没什么特别的,我只是想测试连接性。这是我的服务类:

class WorkerService : IWorkerServiceContract
{
    public static ILogger Logger { get; set; }

    public int Test(int test)
    {
        return test + 1;
    }

    public static ServiceHost Listen(Uri baseAddress)
    {
        ServiceHost host = new ServiceHost(typeof(WorkerService), baseAddress);

        try
        {
            host.Open();
            Logger.WriteLine("Listening at address: " + baseAddress.ToString());
        }

        catch (Exception e)
        {
            Logger.WriteLine("An exception was thrown, reason: {0}", e.Message);
        }

        return host;
    }
}

记录器对象由初始化类实例化,它基本上记录到使用 AllocConsole() 分配的控制台。当我调用 Listen() 时,一切正常,并且我能够通过 WCF 测试客户端进行连接并远程调用 Test() 方法。虽然,当我定义一个代理时:

public partial class WorkerProxy : ClientBase<IWorkerServiceContract>,              
                                   IWorkerServiceContract
{
    public WorkerProxy(EndpointAddress remoteAddress) :
        base("workerEndpoint", remoteAddress)
    { }

    public WorkerProxy(Uri remoteAddress) :
        base("workerEndpoint", new EndpointAddress(remoteAddress))
    { }

    public WorkerProxy(string remoteAddress) :
        base("workerEndpoint", new EndpointAddress(remoteAddress))
    { }

    public int Test(int test)
    {
        return base.Channel.Test(test);
    }
}

并使用以下代码:

WorkerService.Listen("net.tcp://localhost:19000/dcalc");
WorkerProxy wp = new WorkerProxy("net.tcp://localhost:19000/dcalc");
wp.Test(0);

应用程序冻结!这是我的 app.config 文件:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding messageEncoding="Mtom" maxReceivedMessageSize="10485760">
          <readerQuotas maxArrayLength="10485760" />
        </binding>
      </wsHttpBinding>
      <netTcpBinding>
        <binding maxReceivedMessageSize="10485760">
          <readerQuotas maxArrayLength="10485760" />
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service name="DCalc.Manager.ManagerService" behaviorConfiguration="managerServiceBehavior">
        <endpoint address="" binding="wsHttpBinding" contract="DCalc.Common.IManagerServiceContract"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
      <service name="DCalc.Worker.WorkerService" behaviorConfiguration="workerServiceBehavior">
        <endpoint address="" binding="netTcpBinding" contract="DCalc.Common.IWorkerServiceContract"/>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <client>
      <endpoint address="" binding="netTcpBinding" contract="DCalc.Common.IWorkerServiceContract" name="workerEndpoint" />
      <endpoint address="" binding="wsHttpBinding" contract="DCalc.Common.IManagerServiceContract" name="managerEndpoint" />
    </client>
    <behaviors>
      <serviceBehaviors>
        <behavior name="managerServiceBehavior">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
          <serviceDebug includeExceptionDetailInFaults="true" /> 
        </behavior>
        <behavior name="workerServiceBehavior">
          <serviceMetadata policyVersion="Policy15"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

我不明白的是,如您所见,我定义了一个ManagerService,应用程序可以毫无问题地连接到它。这似乎不是协议问题,我使用 wsHttpBinding 得到了相同的结果。

我做错了什么?

【问题讨论】:

    标签: c# .net wcf binding tcp


    【解决方案1】:

    您看到您的应用程序被冻结的原因是线程死锁,这意味着两个线程在执行部分代码/访问公共资源时相互锁定。

    在这种情况下:

    在客户端,当worker代理线程调用Test(0)时,会等待响应回来。

    在“服务器端”,服务器线程同时尝试控制并返回结果。由于两个线程之间的线程亲和性,服务器线程会一直等到工作线程完成,而工作线程却在等待响应,所以它们都不能再进一步了,就会发生死锁。

    【讨论】:

    • 谢谢,我完全忽略了这个问题!我可以连接到 ManagerService,因为我创建了一个在单独线程上运行的异步代理。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2019-11-04
    • 2015-05-09
    • 2013-09-26
    相关资源
    最近更新 更多