Heisenbug
Heisenbug

Reputation: 39194

WebRequest on windows phone 7

I have the following class (I take it from an example on the net, the only thing I've modified is that I use an IP address and port instead of a domain name):

public class ConnectionManager
{
    private static ManualResetEvent allDone = new ManualResetEvent(false);
    private string message = "foobar";

    public Action MessageSent;
    public Action<string> MessageReceived;
    public void SendMessage()
    {
          // Create a new HttpWebRequest object.
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://10.1.91.48:3330/");

        request.ContentType = "application/json; charset=utf-8";
        request.Accept = "application/json";
        // Set the Method property to 'POST' to post data to the URI.
        request.Method = "POST";

        // start the asynchronous operation
        request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
        MessageSent();
        // Keep the main thread from continuing while the asynchronous 
        // operation completes. A real world application 
        // could do something useful such as updating its user interface. 
        allDone.WaitOne();
    }
    private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        Stream postStream = request.EndGetRequestStream(asynchronousResult);


        // Convert the string into a byte array. 
        byte[] byteArray = Encoding.UTF8.GetBytes(message);

        // Write to the request stream.
        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        // Start the asynchronous operation to get the response
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        Console.WriteLine(responseString);
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

        // Release the HttpWebResponse
        response.Close();
        allDone.Set();

        MessageReceived(responseString);
    }
}

The code above fails to send the message. If I step, when I'm inside GetRequestStreamCallback I can see inside IAsyncResult the following error:

AsyncWaitHandle = 'asynchronousResult.AsyncWaitHandle' threw an exception of type 'System.NotSupportedException'

What am I doing wrong? How can I fix this code?

Upvotes: 0

Views: 1909

Answers (3)

Heisenbug
Heisenbug

Reputation: 39194

I ended up using WebClient:

WebClient wc = new WebClient();
wc.DownloadStringCompleted += ReadServerResponse;
wc.DownloadStringAsync(new Uri(url));

Upvotes: 1

Spencer Ruport
Spencer Ruport

Reputation: 35117

As an alternative you could be using RestSharp.

http://restsharp.org/

It makes this sort of thing a lot more trivial. You have to make some slight changes to get it to work on the Windows Phone though:

http://www.tonicodes.net/blog/async-and-restsharp-for-windows-phone-7/

Nothing too crazy.

Upvotes: 1

John Saunders
John Saunders

Reputation: 161831

While it's probably not the solution to your problem, you need to get into the habit of placing your IDisposable objects into using blocks, to ensure they get cleaned up even if exceptions happen:

private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    using (Stream postStream = request.EndGetRequestStream(asynchronousResult))
    {
        byte[] byteArray = Encoding.UTF8.GetBytes(message);

        // Write to the request stream.
        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();
    }

    // Start the asynchronous operation to get the response
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}

private void GetResponseCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    string responseString;
    using (HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(asynchronousResult))
    {
        using (Stream streamResponse = response.GetResponseStream())
        {
            using (StreamReader streamRead = new StreamReader(streamResponse))
            {
                responseString = streamRead.ReadToEnd();
                Console.WriteLine(responseString);
            }
        }
    }
    allDone.Set();

    MessageReceived(responseString);
}

Upvotes: 1

Related Questions