Доступ к коду HTTP-статуса при использовании клиента WCF для доступа к службам RESTful - PullRequest
0 голосов
/ 13 января 2011

Благодаря этому ответу я теперь могу успешно вызывать службу JSON RESTful с помощью клиента WCF. Но этот сервис использует коды состояния HTTP для уведомления о результате. Я не уверен, как я могу получить доступ к этим кодам состояния, так как я просто получаю исключение на стороне клиента при вызове службы. Даже исключение не имеет свойства кода состояния HTTP. Он просто скрыт в самом сообщении об исключении.

alt text

Итак, вопрос в том, как проверить / получить доступ к HTTP-коду статуса ответа при вызове службы.

Ответы [ 2 ]

1 голос
/ 14 января 2011

В качестве быстрого выигрыша вы можете получить доступ к коду статуса в исключении, подобном следующему:

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);
    }
}

Может быть, есть решение с инспектором сообщений. Но я еще не разобрался.

0 голосов
/ 14 января 2011

Решением без 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;
}
...