HttpWebRequest Helper for Silverlight
Ref: http://www.cameronalbert.com/post/2008/03/HttpWebRequest-Helper-for-Silverlight-2.aspx
I wrote this helper class to assist with processing an Http Request via Silverlight 2. Since we can't provide a custom class by deriving from BrowserHttpWebRequest because it is internal I wrote this helper that will create and send the request and raise an event when the request completes. I am using it in my current game to send commands to the server and process the responses.
Edit: I revised the class slightly based on finding from Mike Briseno:
Edit: Some folks have experienced issues with this class after installing Silverlight 2 Beta 2. Be sure to check your domain access policy xml file for the new changes in beta 2 but if you experience issues feel free to contact me and we can try and figure them out.
Edit: Added HttpUtility.UrlEncode to the post values before writing them to the stream. Thanks for the suggestion Stefan!
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net;
namespace Lionsguard
{
public class HttpHelper
{
private HttpWebRequest Request { get; set; }
public Dictionary<string, string> PostValues { get; private set; }
public event HttpResponseCompleteEventHandler ResponseComplete;
private void OnResponseComplete(HttpResponseCompleteEventArgs e)
{
if (this.ResponseComplete != null)
{
this.ResponseComplete(e);
}
}
public HttpHelper(Uri requestUri, string method, params KeyValuePair<string, string>[] postValues)
{
this.Request = (HttpWebRequest)WebRequest.Create(requestUri);
this.Request.ContentType = "application/x-www-form-urlencoded";
this.Request.Method = method;
this.PostValues = new Dictionary<string, string>();
if (postValues != null && postValues.Length > 0)
{
foreach (var item in postValues)
{
this.PostValues.Add(item.Key, item.Value);
}
}
}
public void Execute()
{
this.Request.BeginGetRequestStream(new AsyncCallback(HttpHelper.BeginRequest), this);
}
private static void BeginRequest(IAsyncResult ar)
{
HttpHelper helper = ar.AsyncState as HttpHelper;
if (helper != null)
{
if (helper.PostValues.Count > 0)
{
using (StreamWriter writer = new StreamWriter(helper.Request.EndGetRequestStream(ar)))
{
foreach (var item in helper.PostValues)
{
writer.Write("{0}={1}&", item.Key, HttpUtility.UrlEncode(item.Value));
}
}
}
helper.Request.BeginGetResponse(new AsyncCallback(HttpHelper.BeginResponse), helper);
}
}
private static void BeginResponse(IAsyncResult ar)
{
HttpHelper helper = ar.AsyncState as HttpHelper;
if (helper != null)
{
HttpWebResponse response = (HttpWebResponse)helper.Request.EndGetResponse(ar);
if (response != null)
{
Stream stream = response.GetResponseStream();
if (stream != null)
{
using (StreamReader reader = new StreamReader(stream))
{
helper.OnResponseComplete(new HttpResponseCompleteEventArgs(reader.ReadToEnd()));
}
}
}
}
}
}
public delegate void HttpResponseCompleteEventHandler(HttpResponseCompleteEventArgs e);
public class HttpResponseCompleteEventArgs : EventArgs
{
public string Response { get; set; }
public HttpResponseCompleteEventArgs(string response)
{
this.Response = response;
}
}
}
And this is how I am using it in my app:
private void ProcessCommand(short cmd, string msg)
{
App app = App.Current as App;
HttpHelper helper = new HttpHelper(app.ServerUri, "POST",
new KeyValuePair<string, string>("authKey", app.AuthKey),
new KeyValuePair<string, string>("cmd", cmd.ToString()),
new KeyValuePair<string, string>("msg", msg));
helper.ResponseComplete += new HttpResponseCompleteEventHandler(this.CommandComplete);
helper.Execute();
}
private void CommandComplete(HttpResponseCompleteEventArgs e)
{
txtAlert.Text = e.Response;
}
Comments
Post a Comment