4

我将 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..");
    }

我正确使用它吗?谢谢你。

4

1 回答 1

5

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

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

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

于 2012-08-08T19:30:40.317 回答