2011-04-24 47 views
0

我想捕获发送到我的WCF4 Web服务(REST)和当前所有错误请求(可能是xml/json中的错误)的所有“http 400错误请求”错误仅重定向到通用IIS 400错误请求错误页。如何捕获和记录ASP.NET/WCF错误的请求错误?

Global.asax中的Application_Error或IIS中的自定义覆盖400错误页面处理程序均未调用。

那么有没有其他方法可以捕获WCF中的错误?

回答

2

我一直在我自己和我已经整理它是通过使System.ServiceModel.Dispatcher.IErrorHandler的实现方式看这个:

public class EventLogErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior 
{ 
    public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 
     var log = new EventLog("APPLICATION",Environment.MachineName, "SomeSourceName"); 
     log.WriteEntry("PROVIDING FAULT", EventLogEntryType.Information); 
    } 

    public bool HandleError(Exception error) 
    { 
     var log = new EventLog("APPLICATION", Environment.MachineName, "SomeSourceName"); 
     log.WriteEntry(error.ToString(), EventLogEntryType.Error); 
     return true; 
    } 

    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 (var dispatcher in serviceHostBase.ChannelDispatchers) 
      (dispatcher as ChannelDispatcher).ErrorHandlers.Add(this); 
    } 

    protected override object CreateBehavior() 
    { 
     return new EventLogErrorHandler(); 
    } 

    public override Type BehaviorType 
    { 
     get { return GetType(); } 
    } 
} 

然后我就可以将其添加到系统

<extensions> 
    <behaviorExtensions> 
    <add name="errorhandler" type="SomeAssembly.SomeNamespace.EventLogErrorHandler, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
</extensions> 

的最后加上这种行为您服务行为,当任何形式的出现错误,你可以把正确的逻辑来处理,你认为合适:

类似下面的扩展标记内.serviceModel标签
... 
       <errorhandler /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 

希望这有助于

安德鲁