如何处理WCF上的故障状态? (托管在Windows服务)
我托管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..
}
故障状态我试着模仿这样吗?谢谢。
您正在使用多个CommunicationObject。当您在服务实现中抛出异常时,通道出现故障,但主机不是。 在这种情况下,ServiceHost.Faulted事件不适用。
要记住的一件事是,一旦CommunicationObject进入故障状态,就不能再使用它了。对发生故障的CommunicationObject唯一要做的就是关闭/中止。在您的服务抛出异常之后,如果您创建了新频道,您仍然可以调用该服务。所以这个服务没有错。
从架构的角度来看,服务主机事件并不是实现错误处理的“正确”位置。一般而言,您希望将错误处理作为服务配置的一部分。例如,ServiceHost事件中的错误处理不易移动到IIS托管。您的评论听起来像IErrorHandler不符合您的要求。你想要实现什么要求?
Ernie,我的问题是我不知道CommunicationObject何时进入故障状态。 在我脑海中,我在想,在ServiceHost.Faulted事件中可以这样做: _serviceHost.Abort(); _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1)); _serviceHost.Open(); – Chatumbabub 2012-08-08 19:38:12
以我的观点来看,IErrorHandler是记录异常的好地方,等等。但是我想在通道进入故障状态时“检测”,然后我想调用Abort()打开一个新的WCF服务实例。 – Chatumbabub 2012-08-08 19:56:55
您正在尝试解决不是问题的问题。当通道出现故障时,客户端应该打开一个新通道。但是当通道出现故障时,服务主机不受影响,应该什么也不做。 – ErnieL 2012-08-08 20:00:59
谢谢,但我已经尝试过(实际执行)。自定义IErrorHandler问题保持不变。每个异常在HandleError中都是正确处理的,但是ServiceHost上的Faulted事件仍然不会引发。(我想中止并在故障时重新创建ServiceHost) – Chatumbabub 2012-08-08 17:52:37