• asp.net 调用天气所遇到的问题


      由于在项目用了显示天气的功能,原有的调用方法 直接通过      <iframe name="weather_inc" src="http://i.tianqi.com/index.php?c=code&id=55" style="border: solid 0px #7ec8ea"    width="278" height="240" frameborder="0" marginwidth="0" marginheight="0" scrolling="no">
         </iframe>

        一开始并没有发现什么问题, 但是在最近使用jquery easyui  Datagrid 控件的时候,发现所有 DataGrid 都不显示,而且在其他页面运行很正常的代码也不行,一直找不到原因,之后新建了一个页面,把老页面一个div 一个div 的复制,发现去掉天气 完全没有问题,肯定是天气出了问题。发现报js 错误,联系天气网的客服,发现改完了之后,datagrid 还是不行。

        终于痛定思痛,决定自食其力,人家没问题了,那只能自己搞了,打开 http://i.tianqi.com/index.php?c=code&id=55  看了一下源文件 ,发现

        <script type="text/javascript" src="http://www.tianqi.com/static/js/jquery.min.new.js"></script>

        发现去掉这段完全可以显示天气,不知道他们引用是干嘛的,可是对我没有用啊,

       终于发现问题,应该是js 类库冲突了,因为我页面中引用了这个文件

       <script type="text/javascript" src="js/jquery-easyui-1.3.2/jquery-1.8.0.min.js"></script>

       只能自己处理,于是乎想到了这个类 HttpWebRequest  这个类,

       马上新增页面  tianqi.aspx

      public partial class tianqi : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            { 
    
    
           HttpWebRequest tianqiRequest = (HttpWebRequest)WebRequest.Create("http://i.tianqi.com/index.php?c=code&id=55");
                //如果这里的url是java的servlet编写的
                tianqiRequest.Method = "POST";
                tianqiRequest.ContentType = "application/x-www-form-urlencoded";
                var response = tianqiRequest.GetResponse();
                    string answer;
                    using (var sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312")))
                    {
                        answer = sr.ReadToEnd();
                        if (response != null)
                        {
                            response.Close();
                        }
                    }
          //将这个捣蛋的js 删掉       
              if (answer.Contains("<script type="text/javascript" src="http://www.tianqi.com/static/js/jquery.min.new.js"></script>"))
                    {
                        answer = answer.Replace("<script type="text/javascript" src="http://www.tianqi.com/static/js/jquery.min.new.js"></script>", "");
    
                    }
                    this.Response.Write(answer);
    
             }
       }
    View Code


    问题搞定了,以为可以皆大欢喜了,

    就在高兴的时候发现,点击枣庄,修改  

    点保存, 怎还是枣庄,奇怪从ie 里面访问明明是好的,看了一下源文件

    原来他们发选择的城市存到Cookie 里了,这里不好搞了, 他们网站存的cookie 我怎么读取啊,懵了,

    终于百度找到了一种办法,跨域访问Cookie,下面是代码

    /// <summary>
        /// 获取Cookie的方法类。
        /// </summary>
        public class CookieManger
        {
            /// <summary>
            /// 通过COM来获取Cookie数据。
            /// </summary>
            /// <param name="url">当前网址。</param>
            /// <param name="cookieName">CookieName.</param>
            /// <param name="cookieData">用于保存Cookie Data的<see cref="StringBuilder"/>实例。</param>
            /// <param name="size">Cookie大小。</param>
            /// <returns>如果成功则返回<c>true</c>,否则返回<c>false</c></returns>
            [DllImport("wininet.dll", SetLastError = true)]
            public static extern bool InternetGetCookie(
                string url, string cookieName,
                StringBuilder cookieData, ref int size);
            /// <summary>
            /// 获取当前<see cref="Uri"/><see cref="CookieContainer"/>实例。
            /// </summary>
            /// <param name="uri">当前<see cref="Uri"/>地址。</param>
            /// <returns>当前<see cref="Uri"/><see cref="CookieContainer"/>实例。</returns>
            public static CookieContainer GetUriCookieContainer(Uri uri)
            {
                CookieContainer cookies = null;
    
                // 定义Cookie数据的大小。
                int datasize = 256;
                StringBuilder cookieData = new StringBuilder(datasize);
    
                if (!InternetGetCookie(uri.ToString(), null, cookieData,
                   ref datasize))
                {
                    if (datasize < 0)
                        return null;
    
                    // 确信有足够大的空间来容纳Cookie数据。
                    cookieData = new StringBuilder(datasize);
                    if (!InternetGetCookie(uri.ToString(), null, cookieData,
                        ref datasize))
                        return null;
                }
    
    
                if (cookieData.Length > 0)
                {
                    cookies = new CookieContainer();
                    cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
                }
                return cookies;
            }
    
        }
    View Code

      

    只需在我原有代码加上这段

              

    try    
    { //跨域访问Cookie     
    var CookieContiner = NExplus.NSiter.CookieManger.GetUriCookieContainer(new Uri("http://i.tianqi.com/index.php?c=code&id=55"));
    tianqiRequest.CookieContainer = CookieContiner; }
    catch (Exception ex)
    { }

      

    这下ok了,搞定 完整效果

     

     直接用 iframe 引用我的地址就ok了

  • 相关阅读:
    Python之路(第二十篇) subprocess模块
    Python之路(第十九篇)hashlib模块
    Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块
    Python之路(第十六篇)xml模块、datetime模块
    Java性能优化之编程技巧总结
    Java消息中间件入门笔记
    Java线程池实现原理与技术(ThreadPoolExecutor、Executors)
    Java系统高并发之Redis后端缓存优化
    Java实现一个简单的加密解密方法
    Java实现动态修改Jar包内文件内容
  • 原文地址:https://www.cnblogs.com/hzy168/p/3836607.html
Copyright © 2020-2023  润新知