【发布时间】:2012-02-17 14:36:22
【问题描述】:
我想使用运行状况监控来记录我在自己的错误处理程序中捕获的未处理异常:
public class MyErrorHandler : IErrorHandler, IServiceBehavior
{
#region IServiceBehavior Members
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandler = new VirusInfoErrorHandler();
foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
{
channelDispatcher.ErrorHandlers.Add(errorHandler);
}
}
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
#endregion
#region IErrorHandler Members
public bool HandleError(Exception ex)
{
MyErrorEvent l_errEvt = new MyErrorEvent("Oh Noes!", this, WebEventCodes.WebExtendedBase + 2, ex);
// Always throws a "Value does not fall within the expected range" ArgumentException.
l_errEvt.Raise();
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
#endregion
}
我目前正在使用一个非常简单的自定义 WebRequestErrorEvent:
public MyErrorEvent(string message, object eventSource, int eventCode, Exception exception)
: base(message, eventSource, WebEventCodes.WebExtendedBase + eventCode, exception)
{
}
public override void FormatCustomEventDetails(WebEventFormatter formatter)
{
if (formatter == null)
{
throw new ArgumentNullException("formatter", "Please supply a valid formatter object.");
}
try
{
base.FormatCustomEventDetails(formatter);
formatter.AppendLine("this was a bad error");
}
catch (Exception ex)
{
}
}
异常的堆栈跟踪是:
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(String name)
at System.Web.HttpRequest.get_UrlInternal()
at System.Web.Management.WebRequestInformation..ctor()
at System.Web.Management.WebRequestErrorEvent.PreProcessEventInit()
at System.Web.Management.WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList firingRuleInfos, Int32 index0, Int32 index1)
at System.Web.Management.WebBaseEvent.Raise(WebBaseEvent eventRaised)
at System.Web.Management.WebBaseEvent.Raise()
at ACME.MyErrorHandler.HandleError(Exception ex) in G:\Code\MySvc\Lib\ACME.ErrorHandler\MyErrorHandler.cs:line 78
at System.ServiceModel.Dispatcher.ErrorBehavior.HandleErrorCommon(Exception error, ErrorHandlerFaultInfo& faultInfo)
WebRequestErrorEvent 不能与 WCF 一起使用吗?我可以毫无问题地引发 WebRequestEvents,但不能引发 WebRequestErrorEvents。
【问题讨论】:
-
您对插入 IIS 的 Windows Server AppFabric 之类的东西持开放态度吗?对于 WCF 和 WF 服务来说,这是一个了不起的监控服务。如果您对此持开放态度,我会发布包含更多信息的答案。
-
我绝对对 AppFabric 感兴趣。我目前在 Windows Server 2008 R2 上的 IIS7.5 中托管它,但我需要了解更多关于在 AppFabric 中托管它的信息(我确实安装了它,但据我所知:))。
标签: .net wcf health-monitoring