获取详细的错误从WCF REST
-
22-09-2019 - |
题
我有一个REST业务消耗由.NET WCF客户端。
当遇到错误REST服务返回与含有JSON序列细节响应主体的HTTP 400错误的请求。
如果我执行使用招,Javascript或直接在请求从C#当发生错误时,我可以很容易地访问响应主体。
然而,我使用WCF ChannelFactory
6级相当复杂的接口。由这个代理抛出的异常总是ProtocolException
,没有有用的信息。
有没有什么办法让响应主体时,我得到这个错误?
<强>更新强>
我意识到有不同的方式来做到这一点使用的.Net的负载,并且还有其他的方法来获得错误响应。它是有用的知道,但不回答这个问题。
我们正在使用的REST服务将改变,当他们做复杂的接口得到更新。使用ChannelFactory
新的接口方式,我们会得到编译时(而不是运行时)异常和使这些很多更容易维护和更新代码。
有没有办法使用WCF通道时,得到的回应身体的错误HTTP状态?
解决方案
不使用的ChannelFactory :-)虽然严重。为什么你会创建一个REST接口,然后使用WCF客户端代理。什么是使用REST服务的好处?为什么不直接使用的wsHttpBinding? 与来自REST入门套件HttpClient的类可以使标准HTTP请求,然后反序列化使用的DataContractSerializer的响应。
E.g。
var httpClient = new HttpClient();
var content = httpClient.Get("http://example.org/customer/45").Content;
var customer = content.ReadAsDataContract<Customer>()
其他提示
可以检索异常详细信息如下:
Exception innerException = exception.InnerException;
WebException webException = innerException as WebException;
HttpWebResponse response = webException.Response as HttpWebResponse;
string statusDescription = response.StatusDescription;
HttpStatusCode statusCode = response.StatusCode;
InnerException
的ProtocolException
将是一个WebException
。
您可以从得到HttpWebResponse
并调用GetResponseStream
读取实际响应主体。 (记住读取之前寻求到流的开头)。
var webException = (WebException) protocolException.InnerException;
var response = (HttpWebResponse) webException.Response;
var responseStream = response.GetResponseStream()
responseStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(responseStream);
var responseContent = reader.ReadToEnd();
您可以尝试投掷 WebProtocolException 从服务。这样的错误信息应包含在HTTP响应的主体。看看这篇文章:
我的两个美分是WCF善于使用许多不同的绑定暴露相同的类。当与C#通信,使用SOAP绑定擅长异常信息。如果你必须使用REST风格的结合,你可以使用一个简单的WebRequest调用服务,并使用JSON序列化反序列化的结果。这也给你的反应可以直接访问代码。
该方法描述由user653761作品我;具有访问HttpWebResponse
对象后我可以使用DataContractSerializer
类是这样的:
var serializer = new DataContractSerializer(typeof(MyDataContractType));
var deserialized =
(serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType);
// ...
我想这会工作的任何东西,如果你使用正确的串行WCF可以序列化,没有测试性能(还)。