public UrlServicePara(Message msg, WebRequest request, UrlServiceCallBack callback, Func <Stream, UrlAnanyticResult> funcAnalytic) { this.Message = msg; this.Request = request; this.FuncAnalytic = funcAnalytic; this.Callback = callback; }
static void f_UrlRequestCallBack(IAsyncResult ar) { var pair = (UrlServicePara)ar.AsyncState; WebRequest request = pair.Request; UrlServiceCallBack callback = pair.Callback; Func <Stream, UrlAnanyticResult> funcAnalytic = pair.FuncAnalytic; Message msg = pair.Message; HttpWebResponse response = null; try { response = (HttpWebResponse)request.EndGetResponse(ar); if (response.StatusCode != HttpStatusCode.OK) { callback(new UrlAnanyticResult() { Message = "Response is failed with code: " + response.StatusCode, Msg = msg }); return; } using (var stream = response.GetResponseStream()) { if (funcAnalytic != null) { UrlAnanyticResult rs = funcAnalytic(stream); if (!string.IsNullOrEmpty(rs.Html)) { //string domain = request.RequestUri.Host.Replace('.', '_'); string[] ad = request.RequestUri.Host.Split(new char[] { '.', ':' }); string domain = ad.Length > 2 ? ad[ad.Length - 2] : ad[0]; rs.Html = @"<html><head><meta charset=""utf-8"" /><meta http-equiv=""X-UA-Compatible"" content=""IE=edge"" /><title></title><style type=""text/css"">" + css + "</style></head><body class=" + domain + ">" + rs.Html + @"<script type=""text/javascript""> " + js + " </script>"; rs.Html = rs.Html.Replace("[_URL_]", request.RequestUri.ToString()); File.WriteAllText("result_.html", rs.Html); } rs.Msg = msg; callback(rs); } else { string s = string.Empty; using (var reader = new StreamReader(stream, Encoding.UTF8)) s = reader.ReadToEnd(); if (s.Length > 0) { s = HttpUtility.HtmlDecode(s); } callback(new UrlAnanyticResult() { Ok = true, Html = s, Msg = msg }); } } } catch (Exception ex) { callback(new UrlAnanyticResult() { Message = "Request failed.\r\n" + ex.Message, Msg = msg }); } finally { if (response != null) { response.Close(); } } }
public static void GetAsync(string url, Message msg, Func <Stream, UrlAnanyticResult> func_analytic, UrlServiceCallBack callBack) { var request = f_CreateWebRequest(url); request.BeginGetResponse(f_UrlRequestCallBack, new UrlServicePara(msg, request, callBack, func_analytic)); }