Google Analytics Results Silverlight 2 Released (What a bad news for me)
Oct 14

Dealing with HTTP Web Services in Silverlight is really difficult for me. Many Google search results will ask you to use WebClient and HttpWebClient. But most of them simply doesn’t work. Anyway, after many attempts, finally I got it working properly.

The samples below demonstrate how to submit POST Data and get the corresponding results.

I think Microsoft should really allow the VS to have a choice to ignore cross-domain restriction during development. (Flash has this feature). That will definitely save a lot of development time.

Vote for this sample

Flash is Better! (274 votes)
Silverlight is Better? (174 votes)

Comparison

Flash implementation: 20 minutes (Implemented First)
Silverlight implementation: 60 minutes
What’s the difference?

  • Submit HTTP Request: URLRequest [AS3] vs HttpWebRequest [C#]

Source codes

Flash

Silverlight

Submit HTTP Request: URLRequest [AS3] vs HttpWebRequest [C#]

Getting HTTP Resources in Flash is easy. It is because the sample code provided in Help Page always work.

// AS3
// Create a Request Loader
var loader : URLLoader = new URLLoader();
var request : URLRequest = new URLRequest(POST_ADDRESS);

// pass the post data
request.method = URLRequestMethod.POST;
var variables : URLVariables = new URLVariables();
variables.key1 = "value1";
variables.key2 = "value2";
request.data = variables;

// Add Handlers
loader.addEventListener(Event.COMPLETE, on_complete);
loader.load(request);

private function on_complete(e : Event):void{
	// do your stuff here
}

Actually, to be fair, I usually use the Flash approach to deal with HTTP Request in Silverlight. It may be the reason that makes me wasting a lot of time in implementation. Anyway, let’s see how to submit POST data in C#.

// C#
// Create a request object
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(POST_ADDRESS, UriKind.Absolute));
request.Method = "POST";
// don't miss out this
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetRequestStream(new AsyncCallback(RequestReady), request);

// Sumbit the Post Data
void RequestReady(IAsyncResult asyncResult)
{
    HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
    Stream stream = request.EndGetRequestStream(asyncResult);

    // Hack for solving multi-threading problem
    // I think this is a bug
    this.Dispatcher.BeginInvoke(delegate()
    {
        // Send the post variables
        StreamWriter writer = new StreamWriter(stream);
        writer.WriteLine("key1=value1");
        writer.WriteLine("key2=value2");
        writer.Flush();
        writer.Close();

        request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
    });
}

// Get the Result
void ResponseReady(IAsyncResult asyncResult)
{
    HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

    this.Dispatcher.BeginInvoke(delegate()
    {
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
	// get the result text
        string result = reader.ReadToEnd();
    });
}

Random Posts

One Response to “Flash vs Silverlight: Simple HTTP Post Request”

  1. timheuer Says:

    Actually for this particular sample, I think the use of WebClient in Silverlight would be much simpler and cleaner code to read.

Leave a Reply