使用 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 的解决方案是直接使用 HttpRequestDataContractJsonSerializer 类:

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 状态代码的主要内容,如果未能解决你的问题,请参考以下文章

RESTful WCF 4 服务中移动客户端的用户身份验证

WCF的Restful和TCP方式调用性能比较

WCF 服务 - 使用 json 调用客户端访问 rest 未提供正确的内容类型

WCF RESTFul服务中的异常处理

在 WCF Restful 服务中访问属性“应用”的权限被拒绝

如何在 Restful WCF 服务中管理会话