2012-08-08 84 views
3

我托管WCF作为Widnows服务,但我有处理WCF通道Faulted状态的问题。 ServiceHost上的故障事件从未升起。如何处理WCF上的故障状态? (托管在Windows服务)

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

是否正确地使用它,我:

托管应用程序:

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.. 
    } 

故障状态我试着模仿这样吗?谢谢。

+0

谢谢,但我已经尝试过(实际执行)。自定义IErrorHandler问题保持不变。每个异常在HandleError中都是正确处理的,但是ServiceHost上的Faulted事件仍然不会引发。(我想中止并在故障时重新创建ServiceHost) – Chatumbabub 2012-08-08 17:52:37

回答

5

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

要记住的一件事是,一旦CommunicationObject进入故障状态,就不能再使用它了。对发生故障的CommunicationObject唯一要做的就是关闭/中止。在您的服务抛出异常之后,如果您创建了新频道,您仍然可以调用该服务。所以这个服务没有错。

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

+0

Ernie,我的问题是我不知道CommunicationObject何时进入故障状态。 在我脑海中,我在想,在ServiceHost.Faulted事件中可以这样做: _serviceHost.Abort(); _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1)); _serviceHost.Open(); – Chatumbabub 2012-08-08 19:38:12

+0

以我的观点来看,IErrorHandler是记录异常的好地方,等等。但是我想在通道进入故障状态时“检测”,然后我想调用Abort()打开一个新的WCF服务实例。 – Chatumbabub 2012-08-08 19:56:55

+1

您正在尝试解决不是问题的问题。当通道出现故障时,客户端应该打开一个新通道。但是当通道出现故障时,服务主机不受影响,应该什么也不做。 – ErnieL 2012-08-08 20:00:59

相关问题