我们正在开发一个3层应用程序,我们已被允许使用最新和最好的(MVC2,IIS7.5,WCF,SQL2k8等)。 WCF服务将应用程序层公开给各种Web应用程序。由于我们控制服务和客户端,因此我们决定使用net.tcp绑定来提高其在HTTP上的性能优势。
我们希望在网络应用和服务上使用ELMAH进行错误记录。这是我的问题。有很多关于将ELMAH与WCF一起使用的信息,但它都适用于HTTP绑定。有谁知道是否/如何使用ELMAH与WCF服务公开非HTTP端点?
我的猜测是否定的,因为ELMAH想要HttpContext,它需要{。3}}标志在web.config中为真。来自AspNetCompatibilityEnabled:
IIS 7.0和WAS允许WCF服务通过HTTP以外的协议进行通信。但是,不允许在启用ASP.NET兼容模式的应用程序中运行的WCF服务公开非HTTP端点。当服务收到第一条消息时,这样的配置会生成激活异常。
如果您不能将ELMAH与具有非HTTP端点的WCF服务一起使用,那么后续问题是:我们能否以不需要HttpContext的方式使用ELMAH? 或者更一般地说(以便不提交MSDN错误),有没有办法将ELMAH与具有非HTTP端点的WCF服务一起使用?
注意:我知道我们可以下载Elmah源代码并将其更改为添加填充程序或删除HttpContext依赖项,但我正在尝试避免分叉代码。
答案 0 :(得分:5)
没有。 ELMAH是一个HTTP模块,除非您提供HTTP请求,否则ELMAH将不会执行任何操作
答案 1 :(得分:2)
可以如下
Elmah.ErrorLog.GetDefault(null).Log(new Error(ex));
参考: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa
之前我曾尝试使用this WCF服务解决方案以及AspNetCompatibility模式,它在IIS托管的WCF服务上没有用,但是它正在Visual Studio中开发服务器托管的WCF服务。因此,我不得不满足于上述解决方案。
答案 2 :(得分:0)
您是否尝试过使用static void AppInitialize(){}方法进行初始化?在初始化WCF相关事物时,它适用于非HTTP端点。
有关更多信息,请参阅Wenlong Dong的精彩博文: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx
HTH,
- larsw
答案 3 :(得分:0)
我们将Enterprise Library Exception Handling块与ELMAH结合使用来记录异常。它不是使用任何HTTP模块,而是直接使用调用日志来记录ELMAH。
public class ErrorHandlerServiceBehaviour : BehaviorExtensionElement, IServiceBehavior
{
#region BehaviourExtensionElement Members
public override Type BehaviorType
{
get { return typeof(ErrorHandlerServiceBehaviour); }
}
protected override object CreateBehavior()
{
return new ErrorHandlerServiceBehaviour();
}
#endregion
#region IServiceBehavior Members
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 ElmahExceptionHandler());
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
#endregion
}
然后是ExceptionHandler
public class ElmahExceptionHandler : IErrorHandler
{
#region IErrorHandler Members
public bool HandleError(Exception error)
{
return ExceptionPolicy.HandleException(error, "ServiceExceptions");
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
#endregion
}
然后在app.config的企业库异常策略部分
<exceptionHandling>
<exceptionPolicies>
<add name="ServiceExceptions">
<exceptionTypes>
<add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="NotifyRethrow" name="Exception">
<exceptionHandlers>
<add type="DB.Framework.Logging.ElmahExceptionHandler, DinguBlue.Framework.Logging"
name="Elmah Exception Handler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
</exceptionHandling>
请参阅示例http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx