Я рекомендую вам следовать инструкциям в первом разделе вики-страницы интеграции 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 код интеграции на стороне клиента.