Accessing HTTP status code while using WCF client for accessing RESTful services
Asked Answered
H

2

1

Thanks to this answer, I am now able to successfully call a JSON RESTful service using a WCF client. But that service uses HTTP status codes to notify the result. I am not sure how I can access those status codes since I just receive an exception on client side while calling the service. Even the exception doesn't have HTTP status code property. It is just buried in the exception message itself.

alt text

So the question is, how to check/access the HTTP status code of response when the service is called.

Hypnology answered 13/1, 2011 at 5:22 Comment(0)
W
1

As a quick win, you can access the status code in the exception like this:

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

Maybe there's a solution with a message inspector. But I haven't figured it out yet.

Waler answered 14/1, 2011 at 18:52 Comment(0)
W
0

A solution without WCF would be to use the HttpRequest and DataContractJsonSerializer classes directly:

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;
}
Waler answered 14/1, 2011 at 18:59 Comment(1)
I knew I could do it with plain HTTP requests but using WCF is easier. But your other answer does make sense.Hypnology

© 2022 - 2024 — McMap. All rights reserved.