Каков надлежащий жизненный цикл сервисного клиентского прокси WCF в Silverlight 3?

Существует официально поддерживаемая документация jQuery файл JavaScript для Visual Studio 2008. Этот файл является только временной фиксацией, пока Microsoft не выпускает текущие исправления, которые более адекватно решат проблему.

Встроенный в ASPX:

<% if (false) { %>
    
<% } %>

Встроенный в JavaScript:

/// 

Берут его здесь: ссылки jquery-1.2.6-vsdoc.js

:

6
задан Trinition 10 November 2009 в 20:44
поделиться

3 ответа

Вы должны открывать своего клиента при каждом вызове и сразу же закрывать его. Если вы сомневаетесь, просмотрите файл SVC с помощью IE и посмотрите на приведенный там пример.

0
ответ дан 17 December 2019 в 18:17
поделиться

Я использую Silverlight с WCF с версии V2 (сейчас работаю с V4), и вот что я нашел. В общем, очень хорошо открыть одного клиента и просто использовать его для всех коммуникаций. И если вы не используете DuplexHttBinding, он также отлично работает, чтобы делать прямо противоположное: каждый раз открывать новое соединение, а затем закрывать его, когда вы закончите. И из-за того, как Microsoft спроектировала клиент WCF в Silverlight, вы не увидите большой разницы в производительности между постоянным открытием одного клиента и созданием нового клиента для каждого запроса. (Но если вы создаете нового клиента с каждым запросом, убедитесь, что вы тоже закрываете его.)

Теперь, если вы используете DuplexHttBinding, т.е. если вы хотите вызывать методы на клиенте с сервера, конечно, важно, чтобы вы не закрывали клиент при каждом запросе. Это просто здравый смысл. Однако ни одна из документации не сообщает вам, но что я считаю абсолютно критичным, так это то, что если вы используете DuplexHttBinding, вы должны одновременно открывать только один экземпляр клиента. В противном случае вы re собираетесь столкнуться со всевозможными неприятными проблемами с тайм-аутом, которые будет очень, очень сложно устранить. Ваша жизнь станет значительно проще, если у вас будет только одно соединение.

Я применил это в моем собственном коде, чтобы запустить все мои соединения через один статический класс DataConnectionManager, который выдает Assert, если я пытаюсь открыть второе соединение перед закрытием первого. Несколько фрагментов из этого класса:

    private static int clientsOpen;
    public static int ClientsOpen
    {
        get
        {
            return clientsOpen;
        }
        set
        {
            clientsOpen = value;
            Debug.Assert(clientsOpen <= 1, "Bad things seem to happen when there's more than one open client.");
        }
    }

    public static RoomServiceClient GetRoomServiceClient()
    {
        ClientsCreated++;
        ClientsOpen++;
        Logger.LogDebugMessage("Clients created: {0}; Clients open: {1}", ClientsCreated, ClientsOpen);
        return new RoomServiceClient(GetDuplexHttpBinding(), GetDuplexHttpEndpoint());
    }

    public static void TryClientClose(RoomServiceClient client, bool waitForPendingCalls, Action<Exception> callback)
    {
        if (client != null && client.State != CommunicationState.Closed)
        {
            client.CloseCompleted += (sender, e) =>
            {
                ClientsClosed++;
                ClientsOpen--;
                Logger.LogDebugMessage("Clients closed: {0}; Clients open: {1}", ClientsClosed, ClientsOpen);
                if (e.Error != null)
                {
                    Logger.LogDebugMessage(e.Error.Message);
                    client.Abort();
                }
                closingIntentionally = false;
                if (callback != null)
                {
                    callback(e.Error);
                }
            };
            closingIntentionally = true;
            if (waitForPendingCalls)
            {
                WaitForPendingCalls(() => client.CloseAsync());
            }
            else
            {
                client.CloseAsync();
            }
        }
        else
        {
            if (callback != null)
            {
                callback(null);
            }
        }
    }

Разумеется, раздражает то, что если у вас только одно соединение, вам нужно отловить случай, когда это соединение закрывается непреднамеренно, и попытаться открыть его снова. И затем вам нужно повторно инициализировать все обратные вызовы, для обработки которых были зарегистрированы ваши разные классы. На самом деле это не так уж и сложно, но очень неприятно следить за тем, чтобы все было сделано правильно. И конечно же автоматическое тестирование этой части сложно, если вообще возможно. . .

3
ответ дан 17 December 2019 в 18:17
поделиться

У WCF есть настройки конфигурации, которые говорят ему, как долго он должен ждать возврата вызова, я думаю, что когда он не завершится в разрешенное время, AsyncClose закроет его. Поэтому вызовите client.AsyncClose ().

0
ответ дан 17 December 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: