예제 #1
0
 public UrlServicePara(Message msg, WebRequest request, UrlServiceCallBack callback, Func <Stream, UrlAnanyticResult> funcAnalytic)
 {
     this.Message      = msg;
     this.Request      = request;
     this.FuncAnalytic = funcAnalytic;
     this.Callback     = callback;
 }
예제 #2
0
        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();
                }
            }
        }
예제 #3
0
        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));
        }