Как я препятствую сервису WCF, вводят неработающее состояние?

То, о чем я думал, может быть достигнуто с помощью пониманий списка, но я думал, что была функция, которая сделала это немного более опрятным способом.

т.е. 'панель' список объектов, все из которых имеют атрибут 'идентификатор'

мифический функциональный путь:

foo = 12
foo in iter_attr(bar, 'id')

понимание списка путь:

foo = 12
foo in [obj.id for obj in bar]

Ретроспективно понимание списка путь довольно аккуратен так или иначе.

34
задан Guy 24 November 2008 в 22:31
поделиться

2 ответа

У меня возникла проблема, когда канал оставался в неисправном состоянии после исключения 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.

7
ответ дан 27 November 2019 в 16:21
поделиться

Обычно служба 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

10
ответ дан 27 November 2019 в 16:21
поделиться
Другие вопросы по тегам:

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