Сервисный прокси-сервер замораживает приложение - PullRequest
0 голосов
/ 13 марта 2012

это проблема, с которой я столкнулся, о которой я ничего не понимаю Я определил класс 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;
    }
}

Объект logger создается классом инициализатора, он в основном регистрируется на консоли, выделенной с помощью 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.

Что я делаю не так?

1 Ответ

2 голосов
/ 13 марта 2012

Причина, по которой вы увидели, что ваше приложение зависло из-за взаимоблокировки потоков, что означает, что два потока блокируют друг друга при выполнении части кода / обращении к общему ресурсу.

В этом случае:

На стороне клиента, когда рабочий прокси-поток вызывает Test(0), он будет ожидать ответа ответа.

On "«сторона сервера», поток сервера одновременно пытается получить контроль и вернуть результат.Из-за сходства потоков между двумя потоками поток сервера будет ожидать завершения рабочего потока, но рабочий поток ожидает ответа, поэтому ни один из них не может идти дальше, и возникает тупик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...