我正在托管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..");
}
我是否正确使用它?谢谢。
答案 0 :(得分:5)
您正在使用多个CommunicationObject。当您在服务实现中抛出异常时,通道出现故障,但主机却没有出现故障。 ServiceHost.Faulted事件在这种情况下不适用。
要记住的一件事是,一旦CommunicationObject进入故障状态,就不能再使用它了。出现故障的CommunicationObject唯一要处理的是关闭/中止。在您的服务抛出异常后,如果您创建新频道,您仍然可以调用该服务。因此,服务不会出现故障。
从架构的角度来看,服务主机事件不是实现错误处理的“正确”位置。通常,您希望错误处理成为服务配置的一部分。例如,ServiceHost事件中的错误处理不容易移动到IIS主机。你的评论听起来好像IErrorHandler不符合你的要求。你想要实施什么要求?