2013-02-28 4 views
1

В моем веб-приложений я использую функцию Application_Error в global.asax регистрировать все исключения, как так:Как добавить глобальную обработку ошибок в ФОС службе отдыха

void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 

    while (ex.GetBaseException() != null) 
    { 
     ex = ex.GetBaseException(); 
    } 

    log.writeError(ex.ToString()); 
} 

Я попытался в похожую WCF Служба REST без везения. Как добавить глобальную обработку ошибок? Я видел this article, но я новичок в реализации IServiceBehavior. Где бы я добавил код выше?

ответ

3

Я использую:

1) AppDomain.CurrentDomain.UnhandledException событие

2) TaskScheduler.UnobservedTaskException событие

3) IErrorHandler:

public class ErrorHandler : IErrorHandler 
    { 
     public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
     { 
      var faultException = new FaultException<string>("Server error: " + error.Format()); 
      var messageFault = faultException.CreateMessageFault(); 
      fault = Message.CreateMessage(version, messageFault, null); 
     } 

     public bool HandleError(Exception error) 
     { 
      return false; 
      //return true; //if handled 
     } 
    } 

[AttributeUsage(AttributeTargets.Class)] 
public class ErrorHandlerBehavior : Attribute, IEndpointBehavior, IServiceBehavior 
{ 
    public void Validate(ServiceEndpoint endpoint) 
    { 

    } 

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 

    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
     endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new ErrorHandler()); 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 

    } 

    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) 
    { 
     foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers) 
     { 
      channelDispatcher.ErrorHandlers.Add(new ErrorHandler()); 
     } 
    } 
} 

Это может быть применено ко всему обслуживание. Класс:

[ErrorHandlerBehavior] 
    public class SubscriberInfoTaskService : {} 

или конечной точки:

var endpoint = Host.Description.Endpoints.FirstOrDefault(); 

//foreach (ChannelDispatcher channelDispatcher in Host.ChannelDispatchers) //ChannelDispatcherBase 
//{     
// channelDispatcher.ErrorHandlers.Add(new ErrorHandler()); 
//} 

endpoint.Behaviors.Add(new ErrorHandlerBehavior()); 

здесь об использовании конфигурации: http://www.steverb.com/post/2008/11/24/Useful-WCF-Behaviors-IErrorHandler.aspx

+0

Как я могу сделать "op.ParameterInspectors.Add (новый ValidatingParameterInspector());" line компилировать? Нужно ли мне наследовать какой-то другой класс? – user1886415

+0

Прошу прощения, вам это не нужно. Я удалил эти строки. – SalientBrain

+0

Слава богу !!! Это, наконец, сработало. Я все время гулял по всему миру, ни одна из статей не демонстрирует 100% -ное решение. Ты мой герой, просто спас мой день :) – WtFudgE

Смежные вопросы