gpt4 book ai didi

c# - WCF 服务无法捕获客户端的崩溃

转载 作者:可可西里 更新时间:2023-11-01 02:34:41 25 4
gpt4 key购买 nike

我创建了一个使用 NetTCP 绑定(bind)的 WCF 服务。

我的服务被客户端访问,保存它的回调 channel 并在以后使用它来调用客户端(这是一个持久的 tcp 连接)。一切正常,但如果我决定突然终止客户端 - 我会收到一个我无法捕获的 SocketException(“现有连接被远程主机强行关闭”)。

我已经尝试过什么?

  1. 我在使用回调 channel 的每个方法中添加了 try-catch 子句,甚至在上层 - 启动我的服务的 WCFHost 中。

  2. 我已经尝试获取 channel 和回调 channel 并添加一个处理 channel 故障事件的方法:

    var channel = OperationContext.Current.Channel; 
    channel.Faulted += ChannelFaulted;
    var callbackChannel = OperationContext.Current.GetCallbackChannel<CallbackInterface>();
    var comObj = callbackChannel as ICommunicationObject;
    comObj.Faulted += ChannelFaulted;

简而言之,我正在尝试处理客户端抛出的异常 - 在服务器端。

最佳答案

WCF 服务支持异常处理有两种方式:

1.在 hosts.config 文件中将 serviceDebug.includeExceptionDetailInFaults 属性定义为“true”2. 在服务类上将 includeExceptionDetailInFaults 属性定义为“true”。

例子:

配置文件解决方案:

<behaviors>
<serviceBehaviors>
<behavior name=”ServiceBehavior”>
<serviceMetadata httpGetEnabled=”true”/>
<serviceDebug includeExceptionDetailInFaults=”true”/>
</behavior>
</serviceBehaviors>
</behaviors>

属性类解决方案:

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class CustomersService : ICustomersService
{
private CustomerDetail customerDetail = null;

……等等

抛出异常将 includeExceptionDetailInFaults 设置为 true 是在 WCF 中支持异常的第一步。

下一步是让您的服务抛出 FaultException 异常(System.ServiceModel.FaultException 命名空间中的一个类)。请注意,当您希望从 WCF 主机向 WCF 客户端抛出异常时,您不能期望简单地使用典型的 Exception 类。 要通过 WCF 绑定(bind)引发异常,您需要使用 FaultException 类。

抛出 FaultException 示例:

try
{
//Try to do stuff
}
catch
{
throw new FaultException(“Full ruckus!”);
}

捕获 FaultException 示例:

现在 WCF 客户端可以捕获 FaultException...

try
{
//Client calls services off the proxy
}
catch(FaultException fa)
{
MessageBox.Show(fa.Message);
}

区分故障异常类型FaultException 类是 WCF 异常的泛型类。为了确定发生什么类型的 FaultExceptions,您使用 FaultCode 类。在 WCF 服务上,FaultCode 实现看起来像这样:

try
{
//Connect to a database
}
catch
{
throw new FaultException(“Full ruckus!”, new FaultCode(“DBConnection”));
}

在 WCF 客户端上,FaultCode 实现看起来像这样:

 try
{
//Call services via the proxy
}
catch(FaultException fa)
{
switch(fa.Code.Name)
{
case “DBConnection”:
MessageBox.Show(“Cannot connect to database!”);
break;
default:
MessageBox.Show(“fa.message”);
break;
}
}

更多信息可以看here还有here

关于c# - WCF 服务无法捕获客户端的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36403340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com