我创建了一个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'的例子,但没有看到如何(或它应该)应用于推送。
答案 0 :(得分:0)
您应该使用故障合同,因为它们是明确的合同性故障声明,可以传达给服务的客户消费者,即客户将知道期望的故障类型。
您不应该将此类型的exeption详细信息发送给客户端,因为它可能对客户端构成安全风险或无关紧要,您的目标应该是从异常的详细信息中抽象出消费者。您可以记录异常,然后引发一个错误,例如新的FaultException,将实际异常映射到FaultReason或FaultCode,稍后您可以使用它来关联服务上发生的异常。