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

В одном из учебных руководств WCF я видел следующий пример кода:

Dim service as ...(a WCF service )

try

   ..

   service.close()

catch ex as Exception()
  ... 

   service.abort()

end try

Действительно ли это - корректный способ гарантировать, что средства (т.е. соединения) высвобождены даже под состояниями ошибки?

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
поделиться
Другие вопросы по тегам:

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