private void ImdbCallback(IAsyncResult ar) { var httpCb = ar.AsyncState as MyHttpAsyncResult; if (httpCb != null) { var imdbResponse = httpCb.HttpWebRequest.EndGetResponse(ar) as HttpWebResponse; var context = httpCb.Context; //do stuff if (imdbResponse.StatusCode == HttpStatusCode.OK) { JavaScriptSerializer jsonMaster = new JavaScriptSerializer(); IMDbObj imdbObj = jsonMaster.Deserialize<IMDbObj>(new StreamReader(imdbResponse.GetResponseStream()).ReadToEnd()); if (imdbObj != null && imdbObj.Response == "True") { if (imdbObj.Plot != "N/A") { string bingRequestUri = String.Format("http://api.bing.net/json.aspx?AppId={0}&Query={1}&Sources=Translation&Version=2.2&Translation.SourceLanguage={2}&Translation.TargetLanguage={3}", BING_KEY, imdbObj.Plot, "en", "pt"); //for (int retries = 0; retries < MAX_RETRIES ; ++retries) //{ HttpWebRequest bingRequest = (HttpWebRequest)WebRequest.Create(bingRequestUri); var bAR = new MyHttpAsyncResult(bingRequest, httpCb.Context, (_)=> { context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.ContentType = "text/plain; charset=utf-8"; // In the final version use "application/json; charset=utf-8" string jsonData = jsonMaster.Serialize(imdbObj); var writer = new StreamWriter(context.Response.OutputStream); writer.Write(jsonData); writer.Flush(); httpCb.IsCompleted = true; ((ManualResetEvent)httpCb.AsyncWaitHandle).Set(); httpCb.Callback(httpCb); return; }, httpCb.AsyncState); var bingResponseAR = bingRequest.BeginGetResponse((a) => { var final = a.AsyncState as MyHttpAsyncResult; var bingResponse = final.HttpWebRequest.EndGetResponse(a) as HttpWebResponse; if (bingResponse.StatusCode == HttpStatusCode.OK) { BingObj bingObj = jsonMaster.Deserialize<BingObj>(new StreamReader(bingResponse.GetResponseStream()).ReadToEnd()); if (bingObj.SearchResponse.Translation != null) { imdbObj.Plot = bingObj.SearchResponse.Translation.Results[0].TranslatedTerm; //Ends for final.IsCompleted = true; ((ManualResetEvent) final.AsyncWaitHandle) .Set(); final.Callback(final); return; } } }, bAR); //2 //HttpWebResponse bingResponse = (HttpWebResponse)bingRequest.GetResponse(); //3 //Thread.Sleep(1000 + 1000 * retries + _rand.Next(2000)); //} } } } else //TODO: change this { ReplyError(HttpStatusCode.NotFound, "Movie not found", context.Response); } } throw new NotImplementedException(); }
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { //if (context.Request.Path != "/") //{ // ReplyError(HttpStatusCode.NotFound, "Resource does not exist", context.Response); // return new HttpAsyncResult(); //} //if (context.Request.QueryString["t"] == null) //{ // //context.Request.QueryString["t"] = "matrix"; // ReplyError(HttpStatusCode.BadRequest, "Requests must indicate a movie via parameter <b>t=<i>movie</i></b>", context.Response); // return; //} var t = "matrix"; string imdbRequestUri = null; if (context.Request.QueryString["y"] == null) { imdbRequestUri = String.Format("http://imdbapi.com/?t={0}", t); } else { imdbRequestUri = String.Format("http://imdbapi.com/?t={0}&y={1}", t, context.Request.QueryString["y"]); } HttpWebRequest imdbRequest = (HttpWebRequest)WebRequest.Create(imdbRequestUri); var httpAR = new MyHttpAsyncResult(imdbRequest, context, cb, extraData); imdbRequest.BeginGetResponse(ImdbCallback, httpAR); //1 //HttpWebResponse imdbResponse = (HttpWebResponse)imdbRequest.GetResponse(); return httpAR; }