2012-02-17 90 views
0

我想用健康监测记录未处理的异常,我陷阱我自己的错误处理:健康监测与WCF

 

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。

+1

您是否愿意将Windows Server AppFabric插入IIS?这是一个惊人的WCF和WF服务监控服务。如果您愿意,我会提供更多信息的答案。 – 2012-02-17 14:54:12

+0

我一定对AppFabric感兴趣。我现在在Windows Server 2008 R2上的IIS7.5中托管它,但是我需要知道更多关于在AppFabric中托管它的信息(我确实已经安装了它,但是就我而言:))。 – Bullines 2012-02-17 15:36:10

回答

0

好的,因为对于我来说可能有点多余的指示让AppFabric在你的情况下工作,我会发布一些有用的链接。

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

设置:在@RonJacobs的链接中 - 爱这个人,感谢Ron为你所做的一切 - 他给出了关于在IIS中设置所有内容的一些很好的细节。最有趣的作品是启用端到端跟踪 - http://blogs.msdn.com/b/rjacobs/archive/2010/06/09/tracking-wcf-data-services-with-windows-server-appfabric.aspx

故障排除:在此链接中,一旦最初运行时有一些很好的故障排除信息 - http://www.lhotka.net/weblog/WindowsServerAppFabricAndWCFMonitoring.aspx

让我知道如果你遇到任何问题,我会尽我所能帮助!

+0

感谢您的信息!我无法找到的一件事是建立报告数据库的过程。理想情况下,我想在不同于托管我的Web服务的机器上托管数据库。例如,如果我已经在我的Web服务器上安装了AppFabric,我可以简单地将我的web.config中的连接字符串提供给报表数据库服务器(并且数据库服务器是否也需要完整的AppFabric安装)? – Bullines 2012-02-17 16:07:42

+0

@Bullines简而言之,数据库可以位于任何可用的SQL服务器上,而AppFabric只需要安装在IIS服务器上。您是否无法找到AppFabric配置向导?这里有一个链接可以浏览那个[link] http://www.nagarro.com/blog/windows-server-appfabric/。 – 2012-02-17 16:19:54

+0

从外观上看,我必须重新安装AppFabric才能再次进入配置向导? – Bullines 2012-02-17 16:37:22