0

我想使用健康监控来记录我在自己的错误处理程序中捕获的未处理异常:


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。

4

1 回答 1

0

好的,所以因为我可能有些多余的说明让 AppFabric 在您的情况下工作,所以我将发布一些有用的链接。

您需要做的第一件事是在 Windows 程序下的 AppServer Fabric 配置应用程序中配置监控数据库。

设置:在@RonJacobs 的这个链接中——爱那个人,感谢 Ron 你所做的一切——他提供了一些关于在 IIS 中设置所有内容的详细信息。对您来说最有趣的部分将是启用端到端跟踪 - http://blogs.msdn.com/b/rjacobs/archive/2010/06/09/tracking-wcf-data-services-with-windows-服务器-appfabric.aspx

故障排除:在这个链接中有一些很好的故障排除信息,一旦你开始运行它 - http://www.lhotka.net/weblog/WindowsServerAppFabricAndWCFMonitoring.aspx

如果您遇到任何问题,请告诉我,我会尽我所能提供帮助!

于 2012-02-17T15:53:53.877 回答