То, о чем я думал, может быть достигнуто с помощью пониманий списка, но я думал, что была функция, которая сделала это немного более опрятным способом.
т.е. 'панель' список объектов, все из которых имеют атрибут 'идентификатор'
мифический функциональный путь:
foo = 12
foo in iter_attr(bar, 'id')
понимание списка путь:
foo = 12
foo in [obj.id for obj in bar]
Ретроспективно понимание списка путь довольно аккуратен так или иначе.
У меня возникла проблема, когда канал оставался в неисправном состоянии после исключения ReceiveTimeout. Это может привести к тому, что служба станет непригодной для любых последующих подключений.
Исправление для восстановления службы из неисправного состояния для меня заключалось в обработке события Faailed канала связи:
channelFactory = new ChannelFactory<IService>(endpoint);
channelFactory.Faulted += OnChannelFaulted;
var channel = channelFactory.CreateChannel();
Затем определите OnChannelFaaled:
void OnChannelFaulted(object sender, EventArgs e)
{
channelFactory.Abort();
}
Примечание: я запускаю конфигурацию WCF через код, а не использую привязки в файле Web.config.
Обычно служба WCF размещается в ServiceHost, в случае сбоя службы WCF единственный вариант - убить WCF. службы и запустить новую.
ServiceHost имеет триггер события «Ошибка», который активируется при сбое службы WCF:
ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Open();
Можно получить исключение, вызывающее ошибку, но это требует немного больше работы:
public class ErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
public bool HandleError(Exception error)
{
Console.WriteLine("exception");
return false;
}
}
public class ErrorServiceBehavior : IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
ErrorHandler handler = new ErrorHandler();
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(handler);
}
}
}
ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Description.Behaviors.Add(new ErrorServiceBehavior());
host.Open();
Источники http://www.haveyougotwoods.ca/2009/06/24/creating-a-global-error-handler-in-wcf