Как вызвать метод веб-службы в C # - PullRequest
3 голосов
/ 17 августа 2010

Я хочу знать, как безопасно вызывать метод веб-службы WCF. Являются ли оба эти метода приемлемыми / эквивалентными? Есть ли лучший способ?

1-й способ:

public Thing GetThing()
{
    using (var client = new WebServicesClient())
    {
        var thing = client.GetThing();
        return thing;
    }
}

2-й способ:

public Thing GetThing()
{
    WebServicesClient client = null;
    try
    {
        client = new WebServicesClient();
        var thing = client.GetThing();
        return thing;
    }
    finally
    {
        if (client != null)
        {
            client.Close();
        }
    }
}

Я хочу убедиться, что клиент правильно закрыт и утилизирован.

Спасибо

Ответы [ 3 ]

4 голосов
/ 17 августа 2010

Использование using (без каламбура) не рекомендуется , потому что даже Dispose() может выдавать исключения.

Вот несколько методов расширения, которые мы используем:

using System;
using System.ServiceModel;

public static class CommunicationObjectExtensions
{
    public static void SafeClose(this ICommunicationObject communicationObject)
    {
        if(communicationObject.State != CommunicationState.Opened)
            return;

        try
        {
            communicationObject.Close();
        }
        catch(CommunicationException ex)
        {
            communicationObject.Abort();
        }
        catch(TimeoutException ex)
        {
            communicationObject.Abort();
        }
        catch(Exception ex)
        {
            communicationObject.Abort();
            throw;
        }
    }

    public static TResult SafeExecute<TServiceClient, TResult>(this TServiceClient communicationObject, 
        Func<TServiceClient, TResult> serviceAction)
        where TServiceClient : ICommunicationObject
    {
        try
        {
            var result = serviceAction.Invoke(communicationObject);
            return result;
        } // try

        finally
        {
            communicationObject.SafeClose();
        } // finally
    }
}

С этими двумя:

var client = new WebServicesClient();
return client.SafeExecute(c => c.GetThing());
1 голос
/ 17 августа 2010

Второй способ несколько лучше, так как вы справляетесь с тем фактом, что может возникнуть исключение. Если вы поймали в ловушку и, по крайней мере, зарегистрировали исключение , это было бы лучше.

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

0 голосов
/ 17 августа 2010

Не совсем:

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