双工通信和传递异常

时间:2011-10-13 09:08:34

标签: 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(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: There was an error while trying to serialize parameter http://tempuri.org/:ex. The InnerException message was 'Type 'bedrock.net.AsyncSocketConnectionException' with data contract name 'AsyncSocketConnectionException:http://schemas.datacontract.org/2004/07/bedrock.net' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.

现在我明白它无法序列化,因为它不了解如何发送异常,我不相信我应该发送这个特定的异常,因为它然后让客户需要知道内部工作服务器上的消息传递。

但是最好的方法是什么?我是否应该从服务器向客户端发送此类异常?我看到了一些使用`FaultContract'的例子,但没有看到如何(或它应该)应用于推送。

1 个答案:

答案 0 :(得分:0)

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

您不应该将此类型的exeption详细信息发送给客户端,因为它可能对客户端构成安全风险或无关紧要,您的目标应该是从异常的详细信息中抽象出消费者。您可以记录异常,然后引发一个错误,例如新的FaultException,将实际异常映射到FaultReason或FaultCode,稍后您可以使用它来关联服务上发生的异常。

相关问题