我刚开始使用 WCF,并试图验证支持 JSON 和 XML 的 WCF 休息服务中的故障处理。我的测试服务产生了一个故障,但无论我尝试什么,我都无法让我的客户获取故障的详细信息(并且行为因请求格式和 http 状态代码而异):
我的测试服务产生的故障如下:
public Data GetResponse()
{
throw new WebFaultException<ErrorDetails>(
new ErrorDetails {ErrorMessage = "Server Config Value not set"},
HttpStatusCode.OK
);
}
这相当合理地通过网络发送:
{"ErrorMessage":"Server Config Value not set"}
和:
<ErrorDetails xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorMessage>Server Config Value not set</ErrorMessage>
</ErrorDetails>
我的客户定义为FaultContract
:
[OperationContract]
[WebInvoke(
UriTemplate="/response",
Method="GET",
RequestFormat = WebMessageFormat.Xml, // or .Json
ResponseFormat = WebMessageFormat.Xml // or .Json
)]
[FaultContract(typeof(ErrorDetails), Namespace="")]
Data GetResponse();
这是(格式/状态代码)的完整错误消息:
XML/冲突:
请求响应 CommunicationException:远程服务器返回意外响应:(409) Conflict., System.Collections.ListDictionary Internal, System.ServiceModel.ProtocolException Press a key to exit...
和 XML/OK:
请求响应异常:无法使用 DataContractSerializer 反序列化具有根名称“ErrorDetails”和根命名空间“”的 XML 主体(用于操作“GetResponse”和合同(“IClient”,“”))。确保将XML对应的类型添加到服务的know n types集合中。,System.Collections.ListDictionaryInternal Press a key to exit...
和 JSON/冲突:
请求响应 CommunicationException:远程服务器返回意外响应:(409) Conflict., System.Collections.ListDictionary Internal, System.ServiceModel.ProtocolException Press a key to exit...
和 JSON/OK:
请求响应 响应:请求完成 按某个键退出...
客户端代码以正确的顺序捕获异常:
try
{
Console.WriteLine("Requesting response");
Console.WriteLine("Response: " + client.GetResponse().Message);
Console.WriteLine("Request complete");
}
// sanity check, just in case...
catch (WebFaultException<ErrorDetails> ex)
{
Console.WriteLine("WebFaultException<ErrorDetails>: " + ex.Detail.ErrorMessage + ", " + ex.Reason);
}
catch (FaultException<ErrorDetails> ex)
{
Console.WriteLine("FaultException<ErrorDetails>: " + ex.Detail.ErrorMessage + ", " + ex.Reason);
}
catch (FaultException ex)
{
Console.WriteLine("FaultException: " + ex.Message + ", " + ex.Reason);
}
catch (CommunicationException ex)
{
Console.WriteLine("CommunicationException: " + ex.Message + ", " + ex.Data + ", " + ex.GetType().FullName);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message + ", " + ex.Data);
}
我必须做什么才能FaultException<ErrorDetails>
被抛出并且我可以访问ErrorDetails
?
注意:要点应该是完全可编译和可运行的。