我将 WCF 作为 Widnows 服务托管,但我在处理 WCF channel 的故障状态时遇到了问题。 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..");
}
我是否正确使用它?谢谢。
最佳答案
您正在使用多个 CommunicationObject。当您在服务实现中抛出异常时, channel 出现故障,但主机却没有。 ServiceHost.Faulted 事件不适用于这种情况。
要记住的一点是,一旦 CommunicationObject 进入故障状态,就无法再使用。对有故障的 CommunicationObject 唯一能做的就是关闭/中止。在您的服务抛出异常后,如果您创建一个新 channel ,您仍然可以调用该服务。因此服务没有故障。
从架构的角度来看,服务宿主事件不是实现错误处理的“正确”位置。通常,您希望错误处理成为服务配置的一部分。例如,ServiceHost 事件中的错误处理不会轻易转移到 IIS 托管。您的评论听起来 IErrorHandler 不符合您的要求。您要实现什么要求?
关于c# - 如何处理 WCF 上的故障状态? (在 Windows 服务中托管),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869641/