service.close () по сравнению с service.abort () - пример WCF

Как tweakt сказал, Amazon S3 является хорошей моделью для работы с. Их подписи запроса действительно имеют некоторые функции (такие как слияние метки времени), что справка принимает меры и против случайного и злонамеренного воспроизведения запроса.

хорошая вещь об Основном HTTP состоит в том, что фактически все библиотеки HTTP поддерживают его. Необходимо будет, конечно, потребовать SSL в этом случае, потому что отправка незашифрованных паролей по сети является почти универсально плохой вещью. Основной предпочтительно для Обзора при использовании SSL, потому что, даже если вызывающая сторона уже знает, что учетные данные требуются, Обзор требует, чтобы дополнительное распространение в прямом и обратном направлениях обменивалось значением данного случая. С Основным вызывающие стороны просто отправляют учетным данным первый раз.

, Как только идентификационные данные клиента устанавливаются, авторизация является действительно просто проблемой реализации. Однако Вы могли делегировать авторизацию к некоторому другому компоненту с существующей моделью авторизации. Снова хорошей вещью об Основном здесь является Ваш сервер, заканчивается с копией простого текста пароля клиента, который можно просто передать другому компоненту в инфраструктуре по мере необходимости.

8
задан John Saunders 21 August 2012 в 14:53
поделиться

4 ответа

Мне повезло с этой моделью:

Dim service As New MyService()
Dim closed As Boolean = False
Try
    service.Open()
    If Not service.State = ServiceModel.CommunicationState.Opened Then
        ''Handle a not-opened state here
    End If
    service.MyMethod()
    service.Close()
    closed = true
Catch ex As Exception
    ''Handle errors here
Finally
    If Not closed Then
        service.Abort()
    End If
End Try
service = Nothing
4
ответ дан 5 December 2019 в 07:59
поделиться

См. Недоступно: Попытка WCF # 1 * , где он предлагает удобный метод оболочки:

public delegate void UseServiceDelegate<T>(T proxy);

public static class Service<T>
{
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");

    public static void Use(UseServiceDelegate<T> codeBlock)
    {
        var proxy = (IClientChannel)_channelFactory.CreateChannel();
        var success = false;
        try
        {
            codeBlock((T)proxy);
            proxy.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
    }
}

Использование:

Service<IOrderService>.Use(
    orderService =>
        {
            orderService.PlaceOrder(request);
        });

* Ссылка удалена, поскольку кажется вредоносной.

15
ответ дан 5 December 2019 в 07:59
поделиться

Вы правильно поняли. Я использовал следующий метод расширения, чтобы свести к минимуму повторяющиеся строки кода.

2
ответ дан 5 December 2019 в 07:59
поделиться

Если вы используете кэш на стороне клиента, вы можете рассмотреть возможность использования деревьев выражений (см. http://thegrenade.blogspot.com/2009/07/using-expression-trees-for -more-elegance.html ):

private static TEntity GetItem<TProxy, TEntity, TIdentity>(Expression<Func<TProxy, TIdentity, TEntity>> expression, TProxy proxy, TIdentity id)
    where TEntity : class
    where TProxy : ICommunicationObject
{
    TEntity item = Cache.GetItem<TEntity, TIdentity>(id);
    if (item == null)
    {
        try
        {
            var originalDelegate = expression.Compile();
            item = originalDelegate.Invoke(proxy, id);
        }
        finally
        {
            try{ proxy.Close(); }
            finally { proxy.Abort(); }
        }
        Cache.AddItem<TEntity, TIdentity>(item);
    }
    return item;
}

Использование:

Product p = GetItem((client, identifier) => client.GetProduct(identifier), new CatalogServiceClient(), 123);
0
ответ дан 5 December 2019 в 07:59
поделиться
Другие вопросы по тегам:

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