【问题标题】:Force WCF Host into Faulted State强制 WCF 主机进入故障状态
【发布时间】:2015-07-06 12:39:50
【问题描述】:

有没有办法强制 WCF 主机出错? (更具体地说,基于 REST 的 WCF 主机。) 是否存在可以引发主机故障的异常类型? 如果一个异常不能让主机进入故障状态,有什么办法呢?

在下面的“Api_Root”函数中,我抛出了几种不同类型的异常,它们要么被异常处理程序捕获,要么导致整个过程失败(OutOfMemoryException)。

一些示例代码。它在 VB 中,但任何 C# 帮助也将不胜感激。

<ServiceContract(Name:="API", NameSpace:="urn:test")>
Public Interface IWebServiceApi

    <OperationContract()>
    <WebGet(UriTemplate:="GetObject")>
    Function Api_Root() As Object

End Interface

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall, IncludeExceptionDetailInFaults:=True)>
Public Class WebServiceApi
    Implements IWebServiceApi

    Public Function Api_Root() As Object Implements IWebServiceApi.Api_Root

        //Throw Exception type that causes the Host to Fail

        Return New Object()
    End Function

End Class

Function StartService()

    _Service = New WebServiceHost(GetType(WebServiceApi), baseAddresses)

    _Service.Open()

    AddHandler _Service.Opened, AddressOf Me.Opened
    AddHandler _Service.Closed, AddressOf Me.Closed
    AddHandler _Service.Faulted, AddressOf Me.Faulted

End Function

Sub Faulted(sender As Object, e As EventArgs)

    //Handle the falted service here

End Sub

【问题讨论】:

标签: .net wcf


【解决方案1】:

失败状态不存在。但是,如果您正在谈论关闭主机的通用方法,您可以尝试:

System.ServiceModel.OperationContext.Current.Host.Close();

如果失败对您来说是强制性的,那么您要查找的状态是Faulted。 Host 对象(其类型为 System.ServiceModel.Channels.CommunicationObject)有一个名为 Fault() 的方法,它不是公共的,但您可能会通过一些反思来调用它。这应该会使主机转换到 Faulted 状态。

更新。您还可以使用从 WebServiceHost 派生的主机:

class MyWebServiceHost : System.ServiceModel.Web.WebServiceHost
{
    public MyWebServiceHost(Type serviceType, params Uri[] baseAddresses)
    : base (serviceType, baseAddresses)
    {

    }

    public void Fail()
    {
        base.Fault();
    }
}

【讨论】:

  • 是的,我的意思是故障状态。如果异常不能使主机进入故障状态,那还能做什么?有什么想法吗?
  • 是的,我建议的那个。你试过了吗?
  • 还有一个,可能更简单。我更新了我的答案
  • 这是解决方案。如果您使用 System.ServiceModel.ServiceHost 也提供相同的方法,因此这绝对是测试连接故障处理程序的方法。
【解决方案2】:

让主机进入故障状态的唯一方法是如果在Open() 调用期间发生异常,或者在用户连接时接受传入连接的ChannelDispatcher 在通道创建过程中引发异常。

如果你想自己触发它,我能找到的最简单的方法(在查看reference source 之后)是订阅Opening 事件并在其中抛出异常。这将导致Open() 失败,从而导致连接进入故障状态。

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 2014-06-27
    • 2010-09-23
    • 2014-09-22
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多