强制WCF主机进入故障状态

时间:2015-04-27 21:28:36

标签: .net wcf

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

2 个答案:

答案 0 :(得分:4)

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

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

如果您的失败是强制性的,那么您所寻找的州是错误。 Host对象(其类型为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();
    }
}

答案 1 :(得分:1)

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

如果您想以自己最简单的方式触发它(在查看reference source之后),请订阅Opening事件并在其中抛出异常。这将导致Open()失败,这将导致连接进入故障状态。