【问题标题】:How to handle Fault state on WCF? (hosting in Windows service)如何处理 WCF 上的故障状态? (托管在 Windows 服务中)
【发布时间】:2016-05-05 21:16:14
【问题描述】:

我将 WCF 作为 Widnows 服务托管,但在处理 WCF 通道的故障状态时遇到问题。 ServiceHost 上的故障事件永远不会出现。

托管应用程序:

protected override void OnStart(string[] args)
    {
        _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1));
        _serviceHost.Faulted += _serviceHost_Faulted;
        _serviceHost.Open();
    }

    void _serviceHost_Faulted(object sender, EventArgs e)
    {
        // never raise up..
    }

我尝试像这样模拟的故障状态:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
public class Service1 : IService1
{
    public string GetFault()
    {
        throw new Exception("Should went to fault..");
    }

我是否正确使用它?谢谢。

【问题讨论】:

  • 谢谢,但我已经尝试过了(实际实现中)。与自定义 IErrorHandler 问题保持不变。每个异常都在 HandleError 中得到正确处理,但 ServiceHost 上的故障事件仍然不会引发..(我想在故障时中止并重新创建 ServiceHost)

标签: c# .net wcf event-handling


【解决方案1】:

您正在使用多个 CommunicationObject。当您在服务实现中抛出异常时,通道出现故障,但主机没有。 ServiceHost.Faulted 事件不适用于这种情况。

要记住的一点是,一旦 CommunicationObject 进入故障状态,就不能再使用它。对有故障的 CommunicationObject 唯一要做的就是关闭/中止。在您的服务抛出异常后,如果您创建一个新通道,您仍然可以调用该服务。因此服务没有故障。

从架构的角度来看,服务宿主事件并不是实现错误处理的“正确”位置。通常,您希望错误处理成为服务配置的一部分。例如,ServiceHost 事件中的错误处理不容易转移到 IIS 托管。您的评论听起来像是 IErrorHandler 不符合您的要求。您要实现什么要求?

【讨论】:

  • Ernie,我的问题是我不知道 CommunicationObject 什么时候进入故障状态。在我的脑海中,我在想,在 ServiceHost.Faulted 事件中可以这样做:_serviceHost.Abort(); _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1)); _serviceHost.Open();
  • 在我看来,IErrorHandler 是记录异常等的好地方。但是我想“检测”通道何时进入故障状态,然后我想调用 Abort() 一个打开我的 WCF 服务的新实例。
  • 您正在尝试解决一个不是问题的问题。当通道发生故障时,客户端应该打开一个新通道。但是当通道发生故障时,服务主机不受影响,应该什么都不做。
  • 即使InstanceContextMode设置为Single,ConcurrencyMode也是Single?
  • 是的。 (...然后是评论的强制字符数)
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多