【问题标题】:Accessing HTTP status code while using WCF client for accessing RESTful services使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码
【发布时间】:2011-06-08 07:16:13
【问题描述】:

感谢this answer,我现在能够使用 WCF 客户端成功调用 JSON RESTful 服务。但是该服务使用 HTTP 状态代码来通知结果。我不确定如何访问这些状态代码,因为我只是在调用服务时在客户端收到异常。即使异常也没有 HTTP 状态代码属性。它只是隐藏在异常消息本身中。

所以问题是,当服务被调用时,如何检查/访问响应的 HTTP 状态码。

【问题讨论】:

    标签: wcf json wcf-client wcf-rest


    【解决方案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 更容易。但你的其他答案确实有道理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2011-11-10
      • 2012-04-23
      • 2017-03-17
      • 2011-06-26
      相关资源
      最近更新 更多