Skip to content

Instantly share code, notes, and snippets.

@clausjoergensen
Created August 15, 2011 09:06
Show Gist options
  • Save clausjoergensen/1145931 to your computer and use it in GitHub Desktop.
Save clausjoergensen/1145931 to your computer and use it in GitHub Desktop.
DBService.GetDataAsync
// ORIGINAL
private static void GetDataAsync<T, TRequest>(TRequest input, Action<T, TRequest, string> callback)
{
var request = HttpWebRequest.Create(DBService.ServiceUrl);
request.Method = "POST";
request.BeginGetRequestStream(asyncRequest =>
{
try
{
var httpRequestStream = request.EndGetRequestStream(asyncRequest);
if (httpRequestStream != null)
{
using (var writer = new StreamWriter(httpRequestStream))
{
var obj = JsonConvert.SerializeObject(input);
writer.WriteLine(obj);
}
request.BeginGetResponse(asyncResponse =>
{
try
{
var httpResponse = request.EndGetResponse(asyncResponse);
var httpResponseStream = httpResponse.GetResponseStream();
using (var reader = new StreamReader(httpResponseStream))
{
var json = reader.ReadToEnd();
var result = JsonConvert.DeserializeObject<T>(json);
callback(result, input, json);
}
}
catch (WebException e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
}, asyncRequest);
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
}, request);
}
// REWRITTEN USING REACTIVE EXTENSIONS
private static IObservable<T> GetDataAsync<T, TRequest>(TRequest input)
{
var request = HttpWebRequest.Create(DBService.ServiceUrl);
request.Method = "POST";
var getRequestStream = Observable.FromAsyncPattern<Stream>(
request.BeginGetRequestStream,
request.EndGetRequestStream);
var getResponse = Observable.FromAsyncPattern<WebResponse>(
request.BeginGetResponse,
request.EndGetResponse);
return getRequestStream()
.SelectMany(stream =>
{
using (var writer = new StreamWriter(stream))
writer.WriteLine(JsonConvert.SerializeObject(input));
return getResponse();
})
.Select(webResponse =>
{
using (var reader = new StreamReader(webResponse.GetResponseStream()))
return JsonConvert.DeserializeObject<T>(reader.ReadToEnd());
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment