Что делает System.ServiceModel.Clientbase.Open ()? - PullRequest
5 голосов
/ 12 марта 2011

Что делает System.ServiceModel.Clientbase.Open ()?Я никогда не использовал это, но только сталкивался с этим в некотором коде.Может ли он генерировать исключения?Если Close () не вызывается, это проблема?

Ответы [ 2 ]

4 голосов
/ 12 марта 2011

Если вы создаете прокси-сервер для службы WCF, прокси-сервер фактически является ClientBase

Пример из моего приложения:

public class DataClient : ClientBase<Classes.IDataService>, Classes.IDataService
{
    public DataClient(string connectToHost)
        : base(new NetTcpBinding(SecurityMode.Transport)
            {
                PortSharingEnabled = true,
                Security = new NetTcpSecurity()
                {
                    Transport = new TcpTransportSecurity()
                    {
                        ClientCredentialType = TcpClientCredentialType.Windows
                    }
                }
            },
            new EndpointAddress(string.Format("net.tcp://{0}:5555/MyService",connectToHost)))
    { }

    #region IDataService Members

    public Classes.Folder GetFolder(string entryID)
    {
        return Channel.GetFolder(entryID);
    }

    public Classes.IItem GetItem(string entryID)
    {
        return Channel.GetItem(entryID);
    }

    #endregion
}

РЕДАКТИРОВАТЬ В соответствии с вашим запросом, я гуглилбит и найдено this :

Реализация ICommunicationObject.Open ()

Это привело к this :

CommunicationException

Не удалось открыть объект ICommunicationObject, и он вошел в состояние «Сбой».

TimeoutException

Истекло время ожидания по умолчанию до того, как объект ICommunicationObject смогвойдите в открытое состояние и вошли в состояние Failed.

Кроме того, за опыт и то, что я встречал в сети, не закрывая ваших клиентов, может вызвать различные формы странности, и поэтомуобычно считается " Плохая вещь ".

0 голосов
/ 15 марта 2018

Только что нашел эту статью:

Рекомендация. Всегда открывайте клиентский прокси WCF явно, когда он используется совместно. https://blogs.msdn.microsoft.com/wenlong/2007/10/25/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared/

Что в итоге гласит:

Если вы сначала не вызываете метод «Открыть», прокси-сервер будет открыт внутри, когда будет выполнен первый вызов прокси-сервера. Это называется автооткрытием.

Почему? Когда первое сообщение отправляется через автоматически открываемый прокси, оно вызывает автоматическое открытие прокси. Вы можете использовать .NET Reflector, чтобы открыть метод System.ServiceModel.Channels.ServiceChannel.Call и увидеть следующий код:

if (!this.explicitlyOpened)
{
   this.EnsureDisplayUI();
   this.EnsureOpened(rpc.TimeoutHelper.RemainingTime());
}

Когда вы углубитесь в EnsureOpened, вы увидите, что он вызывает CallOnceManager.CallOnce. Для не-первых вызовов вы должны нажать SyncWait.Wait, который ожидает завершения первого запроса. Этот механизм должен гарантировать, что все запросы ждут открытия прокси-сервера, а также обеспечивает правильный порядок выполнения. Таким образом, все запросы сериализуются в одну последовательность выполнения до тех пор, пока все запросы не будут удалены из очереди. Это нежелательное поведение в большинстве случаев.

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

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