WCF - IsOneway не ведет себя так, как если бы это была операция Oneway - PullRequest
3 голосов
/ 13 июля 2011

Я определил атрибут OneWay в некоторых методах моего сервиса, но они не ведут себя как вызов Oneway.Мой клиент ожидает завершения вызова и возврата из службы.Я предполагаю, что операции Oneway являются неблокирующими операциями, и клиенту все равно, что происходит с вызываемой функцией.Он просто звонит и забывает об этом.Это правильно?

Проблема: После вызова OperationContract2 я немедленно закрываю прокси-сервер, но мой клиент ждет завершения выполнения.

    if (((ICommunicationObject)myServices).State == CommunicationState.Opened)
        {
        ((ICommunicationObject)myServices).Close();
        }

Что-то не так с конфигами?

Конфигурация сервера:

  <netTcpBinding>
    <binding name="GoCustomBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="0" maxReceivedMessageSize="2147483647">
    </binding>
  </netTcpBinding>

Сервисный контракт:

[ServiceContract]
public interface IMyServices
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void OPeration1(List<int> someIds);

    [OperationContract(IsOneWay = true)]
    void OPeration2(SomeClass p1);

}

Клиентский прокси:

[ServiceContract]
public interface IMyServices
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void Operation1(List<int> someIds);

    [OperationContract(IsOneWay = true)]
    void Operation2(SomeClass p1);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ServiceClient : ClientBase<IMyServices>, IMyServices
{
    public void ScheduleOptimization(List<int> someIds)
    {
        Channel.Operation1(routeID);
    }

    public void Operation1(SomeClass p1)
    {
        Channel.Operation2(pasDataMsg);
    }
}

1 Ответ

7 голосов
/ 13 июля 2011

Из документации для этого атрибута :

Указание, что операция является односторонней, означает только то, что ответного сообщения нет.Можно заблокировать, если невозможно установить соединение, или исходящее сообщение очень велико, или если служба не может прочитать входящую информацию достаточно быстро.Если клиент требует неблокирующего вызова, сгенерируйте операции AsyncPattern.Для получения дополнительной информации см. Односторонние услуги и Использование услуг с использованием клиента.

Может ли это быть вашей проблемой?

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