【发布时间】:2017-10-24 08:29:59
【问题描述】:
我正在尝试使用实现 IErrorHandler 来向 elmah 发出信号以记录未处理的异常。
我的解决方案中有多个项目。我有一个实用程序项目,我在其中实现了 IErrorHandler。
public abstract class BaseWebServiceErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error == null) return;
if (System.Web.HttpContext.Current == null)
{
ErrorLog.GetDefault(null).Log(new Error(error));
}
else
{
ErrorSignal.FromCurrentContext().Raise(error);
}
}
}
public class ServiceErrorBehaviourAttribute : Attribute, IServiceBehavior
{
Type errorHandlerType;
public ServiceErrorBehaviourAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
var errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
foreach (var channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
var channelDispatcher = channelDispatcherBase as ChannelDispatcher;
channelDispatcher?.ErrorHandlers.Add(errorHandler);
}
}
}
在一个 WCF 项目中,我有一个 BaseWebService 类,我试图在其中使用服务行为属性
[ServiceErrorBehaviour(typeof(WebServiceErrorHandler))]
public abstract class BaseWebService : AbstractWebService
{
public BaseWebService()
{
//Code logic
}
}
public class WebServiceErrorHandler : BaseWebServiceErrorHandler
{
}
现在使用上面的代码,当发生未处理的异常时,我收到服务行为不匹配的错误。
但是当我在我的 BaseWebService 中定义了 IErrorHandler 时,它自己就可以工作了。
[ServiceErrorBehaviour(typeof(WebServiceErrorHandler))]
public abstract class BaseWebService : AbstractWebService
{
public BaseWebService()
{
//Codelogic
}
}
//public class WebServiceErrorHandler : BaseWebServiceErrorHandler
//{
//}
public class WebServiceErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error == null) return;
if (System.Web.HttpContext.Current == null)
{
ErrorLog.GetDefault(null).Log(new Error(error));
}
else
{
ErrorSignal.FromCurrentContext().Raise(error);
}
}
}
通过上述实现,它运行良好,并且也可以登录 Elmah。
我是否缺少实用程序项目中的一些参考资料? 感谢您的建议。
【问题讨论】:
-
我写了这个指南:Logging to ELMAH from WCF 这可能会有所帮助。没有将此作为答案发布,因为我从未使用基类对此进行过测试。
-
@ThomasArdal 我做了一个类似的实现,但不知道为什么它不能像你说的那样与基类一起工作。
标签: c# wcf visual-studio-2015 projects-and-solutions elmah