使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码
Posted
技术标签:
【中文标题】使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码【英文标题】:Accessing HTTP status code while using WCF client for accessing RESTful services 【发布时间】:2011-06-08 07:16:13 【问题描述】:感谢this answer,我现在能够使用 WCF 客户端成功调用 JSON RESTful 服务。但是该服务使用 HTTP 状态代码来通知结果。我不确定如何访问这些状态代码,因为我只是在调用服务时在客户端收到异常。即使异常也没有 HTTP 状态代码属性。它只是隐藏在异常消息本身中。
所以问题是,当服务被调用时,如何检查/访问响应的 HTTP 状态码。
【问题讨论】:
【参考方案1】:作为一个快速的胜利,您可以像这样访问异常中的状态代码:
try
client.DoSomething(); // call the REST service
catch (Exception x)
if (x.InnerException is WebException)
WebException webException = x.InnerException as WebException;
HttpWebResponse response = webException.Response as HttpWebResponse;
Console.WriteLine("Status code: 0", response.StatusCode);
也许有一个带有消息检查器的解决方案。但我还没想通。
【讨论】:
【参考方案2】:没有 WCF 的解决方案是直接使用 HttpRequest 和 DataContractJsonSerializer 类:
private T ExecuteRequest<T>(Uri uri, object data)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
// If we have data, we use a POST request; otherwise just a GET request.
if (data != null)
request.Method = "POST";
request.ContentType = "application/json";
DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType());
Stream requestStream = request.GetRequestStream();
serializer.WriteObject(requestStream, data);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T));
Stream responseStream = response.GetResponseStream();
T result = (T)deserializer.ReadObject(responseStream);
responseStream.Close();
response.Close();
return result;
【讨论】:
我知道我可以使用普通的 HTTP 请求来做到这一点,但使用 WCF 更容易。但你的其他答案确实有道理。以上是关于使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码的主要内容,如果未能解决你的问题,请参考以下文章
WCF 服务 - 使用 json 调用客户端访问 rest 未提供正确的内容类型