c# - 如何处理 WCF 上的故障状态? (在 Windows 服务中托管)

标签 c# .net wcf event-handling

我将 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/

相关文章:

c# - 无法将 Autofac 添加到 .Net Core 中的 ServiceCollection

c# - WPF 在用户控件上剪切、复制、粘贴功能

c# - TNS :could not resolve the connect identifier specified I have done the research

c# - 未引用的事件 DispatcherTimer 和垃圾收集器

c# - MySqlDataReader 为表中的所有行返回相同的值

wcf - 定义 WCF XML 响应架构

C# Linq to XML 读取带有属性的多个标签

c# - 当 dbContext 带有 'using' block 时,如何从 Linq 返回 IQueryable 到 SQL 查询?

wpf - XAML 设计器在使用 WCF 服务时不起作用

.net - 在 .NET WCF 服务中组织大量方法的好方法是什么?