我有一个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;

InnerExceptionProtocolException将是一个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&REST

我的两个美分是WCF善于使用许多不同的绑定暴露相同的类。当与C#通信,使用SOAP绑定擅长异常信息。如果你必须使用REST风格的结合,你可以使用一个简单的WebRequest调用服务,并使用JSON序列化反序列化的结果。这也给你的反应可以直接访问代码。

该方法描述由user653761作品我;具有访问HttpWebResponse对象后我可以使用DataContractSerializer类是这样的:

var serializer = new DataContractSerializer(typeof(MyDataContractType));
var deserialized = 
    (serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType);

// ...

我想这会工作的任何东西,如果你使用正确的串行WCF可以序列化,没有测试性能(还)。

scroll top