Как я могу проверить, что соединение все еще действует для клиента Silverlight, использующего net.tcp для дуплекса? - PullRequest
0 голосов
/ 13 ноября 2010

Я собираю службу WCF, используя net.tcp и netTcpBinding, чтобы получить двустороннюю связь с моим клиентом Silverlight.Я вызываю службу из приложения Silverlight, и служба вызывает другой сервер, передавая ему метод обратного вызова в классе обслуживания WCF.Удаленный сервер перезванивает несколько раз, и каждый раз служба WCF использует канал обратного вызова для отправки данных клиенту Silverlight.В большинстве случаев все работает хорошо.

Если пользователь отправляет большой запрос, я получаю исключение TimeoutException после того, как большое количество обратных вызовов уже сработало.(Ясно, что в другом месте есть работа, чтобы предотвратить это, но я бы хотел сначала обнародовать сервис.)

Я ожидал сделать что-то вроде 'if (client.ConnectionState == failed)'проверьте, прежде чем пытаться перезвонить клиенту Silverlight, но я не могу найти объект, который содержит состояние соединения.Есть один?Я подхожу к этому не с той стороны?

Это мое первое предприятие в сервисе net.tcp и duplex.Я только что переехал, и моя библия WCF все еще в коробке.Где-то.:-) Так что я не могу сделать свое обычное фоновое чтение.

Любые указатели будут с благодарностью приняты.Вот некоторый голый код на случай, если моё описание слишком густое:

    private IActiveDirectoryClient client;
    private AsyncSearchRunner runner;

    public void Search(Request request)
    {
        this.client = OperationContext.Current.GetCallbackChannel<IActiveDirectoryClient>();

        runner = new AsyncSearchRunner();
        runner.Run(request.SearchRoot, request.SearchFilter, request.PageSize, 
            System.DirectoryServices.Protocols.SearchScope.Subtree, SendObjects);
    }

    private void SendObjects(List<DirectoryObject> items)
    {
        Response response = new Response();
        response.DirectoryObjects = items.ToArray();

        client.SendResponse(response);
    }

1 Ответ

0 голосов
/ 29 апреля 2011

Да, существует свойство State, определенное в классе ClientBase<> (все прокси-классы получены из ClientBase<>).

Существуют некоторые прокси-оболочки, которые обрабатывают состояния сбоя соединения и при необходимости восстанавливают соединения. Google для "wcf proxy wrapper".

Вы также можете что-то приготовить в домашних условиях, если используете какой-либо шаблон ServiceLocator.

...