Как использовать сервис WCF, используя Autofac? - PullRequest
4 голосов
/ 21 декабря 2011

Я знаю, используя Autofac, можно разместить службу WCF. А как насчет обратного пути? Можно ли использовать услугу WCF, используя Autofac? Я имею в виду сторону клиента. Если да, то как это можно сделать?

Ответы [ 3 ]

5 голосов
/ 22 декабря 2011

Взгляните на http://code.google.com/p/autofac/wiki/WcfIntegration#Clients. Вам просто нужно зарегистрировать конфигурацию привязки, зарегистрировав ChannelFactory<IYourServiceContract>, а затем зарегистрировать создание канала. Не забудьте вызвать UseWcfSafeRelease ().

2 голосов
/ 21 декабря 2011

Я рекомендую вам следовать инструкциям в первом разделе вики-страницы интеграции WCF .

Единственное замечание об этой реализации - UseWcfSafeRelease вызывает ICommunicationObject.Close() после выпуска экземпляра службы. На мой взгляд, это плохо, потому что он блокируется до тех пор, пока веб-вызов полностью не обработает все буферы, а в некоторых случаях блокирует поток пользовательского интерфейса (в Silverlight). Я бы лучше назвал ICommunicationObject.Abort(), потому что если я освобождаю экземпляр компонента, это означает, что мне больше не нужны его процессы. Тем не менее, я использую следующую версию RegistrationExtensions class :

/// <summary>
/// Extend the registration syntax with WCF-specific helpers.
/// </summary>
public static class RegistrationExtensions
{
    /// <summary>
    /// Dispose the channel instance in such a way that exceptions 
    /// </summary>
    /// <typeparam name="TLimit">Registration limit type.</typeparam>
    /// <typeparam name="TActivatorData">Activator data type.</typeparam>
    /// <typeparam name="TRegistrationStyle">Registration style.</typeparam>
    /// <param name="registration">Registration to set release action for.</param>
    /// <returns>Registration builder allowing the registration to be configured.</returns>
    /// <remarks>This will eat exceptions generated in the closing of the channel.</remarks>
    public static IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle>
        UseWcfSafeRelease<TLimit, TActivatorData, TRegistrationStyle>(
            this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registration)
    {
        if (registration == null) throw new ArgumentNullException("registration");
        return registration.OnRelease(CloseChannel);
    }

    static void CloseChannel<T>(T channel)
    {
        var disp = (IClientChannel) channel;
        disp.Abort();
    }
}

Хотя, если вам это нравится больше, вы наверняка можете использовать встроенный в Autofac код интеграции на стороне клиента.

0 голосов
/ 26 сентября 2014

@ Павел Гатилов Извлекаю через отражатель

private static void CloseChannel<T>(T channel)
{
    IClientChannel channel2 = (IClientChannel) channel;
    try
    {
        if (channel2.State == CommunicationState.Faulted)
        {
            channel2.Abort();
        }
        else
        {
            channel2.Close();
        }
    }
    catch (TimeoutException)
    {
        channel2.Abort();
    }
    catch (CommunicationException)
    {
        channel2.Abort();
    }
    catch (Exception)
    {
        channel2.Abort();
        throw;
    }
}
...