Wcf 双工通信和传递异常

Wcf 双工通信和传递异常,wcf,web-services,Wcf,Web Services,我创建了一个WCF web服务,它通过Jabber.net连接到XMPP服务。其想法是该服务将充当Silverlight客户端用于消息传递的代理 IMessagingClient.cs: [OperationContract(IsOneWay = true, AsyncPattern = true)] IAsyncResult BeginError(Exception ex, AsyncCallback callback, object state); void EndError(IAsyncR

我创建了一个WCF web服务,它通过Jabber.net连接到XMPP服务。其想法是该服务将充当Silverlight客户端用于消息传递的代理

IMessagingClient.cs:

[OperationContract(IsOneWay = true, AsyncPattern = true)]
IAsyncResult BeginError(Exception ex, AsyncCallback callback, object state);
void EndError(IAsyncResult result);
在我的服务器代码中,我已将错误处理程序连接到JabberClient

private void xmppClient_OnError(object sender, Exception ex)
{
    lock (xmppClient)
    {
        Debug.WriteLine("xmppClient_OnError: {0}", ex);
        // Let the client know there has been a problem
        client.BeginError(ex, OnSendErrorCompleted, client);
    }
}
但是,当发生SocketException时,它无法传递异常

System.ServiceModel.CommunicationException:尝试序列化参数时出错。InnerException消息为'Type'Basefick.net.AsyncSocketConnectionException',数据协定名称为'AsyncSocketConnectionException:http://schemas.datacontract.org/2004/07/bedrock.net”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,通过使用NoNyType属性,或者将它们添加到传递给DATACONTROTTRORALIZER的已知类型列表中。有关更多详细信息,请参阅InnerException。

现在我知道它不能被序列化,因为它不知道如何发送异常,我也不认为我应该发送这个特定的异常,因为它会让客户端需要知道服务器上消息的内部工作方式


但最好的方法是什么呢?我是否应该将这种异常从服务器发送到客户端?我看到了一些使用“FaultContract”的示例,但没有说明如何(或应该如何)应用于推送。

您应该使用FaultContract,因为它们是可以传达给服务的客户消费者的明确的故障合同声明,即客户将知道预期的故障类型


您不应该将这种类型的例外详细信息发送给客户机,因为它可能存在安全风险或与客户机无关,您应该将目标从例外的详细信息中抽象出来。您可以记录异常,然后引发一个错误,可能类似于new FaultException,将实际异常映射到一个FaultReason或FaultCode,您可以稍后使用它关联服务上发生的异常。

这听起来很合理。我只是不完全清楚如何通过此处使用的推送机制发送故障。@Firedragon和我现在无法编辑以上内容:<您的问题是,只能在operation contract属性上指定故障契约,在上面的示例中,该属性对于client.BeginError(…)如果在处理BeginError过程中发生错误,则将故障发送回服务器。
我的建议是在BeginError的定义中添加故障约定类型(例如,定义故障约定类,并在回调时将其传递回服务器。这将解决序列化问题。