.net 强制WCF主机进入故障状态

.net 强制WCF主机进入故障状态,.net,wcf,.net,Wcf,有没有办法强迫WCF主机发生故障?(更具体地说,是基于REST的WCF主机。) 是否存在可能引发主机故障的异常类型? 如果异常无法使主机进入故障状态,那么可以做什么 在下面的“Api_Root”函数中,我抛出了几种不同类型的异常,它们要么被异常处理程序捕获,要么导致整个过程失败(OutOfMemoryException) 一些示例代码。它是用VB编写的,但是任何C#帮助都将不胜感激 <ServiceContract(Name:="API", NameSpace:="urn:test")&g

有没有办法强迫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

公共接口IWebServiceApi
函数Api_Root()作为对象
端接口
公共类WebServiceApi
实现IWebServiceApi
作为对象的公共函数Api_Root()实现IWebServiceApi.Api_Root
//引发导致主机失败的异常类型
返回新对象()
端函数
末级
函数StartService()
_服务=新的WebServiceHost(GetType(WebServiceApi),基本地址)
_Service.Open()
AddHandler\u Service.Opened,AddressOf Me.Opened
AddHandler\u Service.Closed,AddressOf Me.Closed
AddHandler\u Service.Faulted,AddressOf Me.Faulted
端函数
子故障(发送方作为对象,e作为事件参数)
//在这里处理这个失败的服务
端接头

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

System.ServiceModel.OperationContext.Current.Host.Close();
如果必须出现故障,则您要查找的状态为故障状态。宿主对象(其类型为System.ServiceModel.Channels.CommunicationObject)有一个名为Fault()的方法,该方法不是公共的,但您可能可以通过一些反射来调用它。这将使主机转换为故障状态

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

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

    }

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

使主机处于故障状态的唯一方法是在
Open()
调用期间发生异常,或者在用户连接时接受传入连接的在通道创建过程中抛出异常


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

是的,我指的是故障状态。如果异常无法使主机进入故障状态,那么可以做什么?有什么想法吗?是的,就是我建议的。你试过了吗?还有一个,可能更简单。我更新了我的答案这就是解决方案。如果您使用System.ServiceModel.ServiceHost,也会提供相同的方法,因此这绝对是测试连接故障处理程序的方法。您是否尝试过抛出故障异常?这些链接可能很有意思:@EdmundYeung99抛出一个
FaultException
或从中派生的类是避免客户端进入故障状态的唯一方法。OP希望其主机连接进入故障状态。