强制 WCF 主机进入故障状态
Force WCF Host into Faulted State
有没有办法强制 WCF 主机出错? (更具体地说,是基于 REST 的 WCF 主机。)
有没有可以抛出的Exception类型会导致宿主出错?
如果异常不能使主机进入故障状态,那什么可以?
在下面的 "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
失败状态不存在。但是,如果您正在谈论关闭主机的通用方法,您可以尝试:
System.ServiceModel.OperationContext.Current.Host.Close();
如果失败对您来说是强制性的,那么您正在寻找的状态是 Faulted。 Host 对象(其类型为 System.ServiceModel.Channels.CommunicationObject)有一个名为 Fault() 的方法,它不是 public,但您可能可以通过一些反思来调用它。这应该会使主机过渡到 Faulted 状态。
更新。您还可以使用从 WebServiceHost 派生的主机:
class MyWebServiceHost : System.ServiceModel.Web.WebServiceHost
{
public MyWebServiceHost(Type serviceType, params Uri[] baseAddresses)
: base (serviceType, baseAddresses)
{
}
public void Fail()
{
base.Fault();
}
}
使主机进入故障状态的唯一方法是 Open()
调用期间发生异常,或者接受传入连接的 ChannelDispatcher 在通道创建过程中抛出异常作为用户连接。
如果你想自己触发它,我能找到最简单的方法(在查看 reference source a bit) is subscribe to the Opening
事件并在其中抛出异常后。这将导致 Open()
失败,这将导致连接进入故障状态。
有没有办法强制 WCF 主机出错? (更具体地说,是基于 REST 的 WCF 主机。) 有没有可以抛出的Exception类型会导致宿主出错? 如果异常不能使主机进入故障状态,那什么可以?
在下面的 "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
失败状态不存在。但是,如果您正在谈论关闭主机的通用方法,您可以尝试:
System.ServiceModel.OperationContext.Current.Host.Close();
如果失败对您来说是强制性的,那么您正在寻找的状态是 Faulted。 Host 对象(其类型为 System.ServiceModel.Channels.CommunicationObject)有一个名为 Fault() 的方法,它不是 public,但您可能可以通过一些反思来调用它。这应该会使主机过渡到 Faulted 状态。
更新。您还可以使用从 WebServiceHost 派生的主机:
class MyWebServiceHost : System.ServiceModel.Web.WebServiceHost
{
public MyWebServiceHost(Type serviceType, params Uri[] baseAddresses)
: base (serviceType, baseAddresses)
{
}
public void Fail()
{
base.Fault();
}
}
使主机进入故障状态的唯一方法是 Open()
调用期间发生异常,或者接受传入连接的 ChannelDispatcher 在通道创建过程中抛出异常作为用户连接。
如果你想自己触发它,我能找到最简单的方法(在查看 reference source a bit) is subscribe to the Opening
事件并在其中抛出异常后。这将导致 Open()
失败,这将导致连接进入故障状态。