用c#分析一个网页.
但这个地址是指向另外一个地址的.
也就是访问网址A,网址A会转向网址B.
c#里面如何写一个函数,通过输入网址A,来获取网址B.
谢谢各位,解决后立即给分.

解决方案 »

  1.   

    使用WebRequest获取那个网页,在获取得WebResponse里面有一个ResponseUri,这个就是跳转后的地址
      

  2.   

    如果http响应的StatusCode 为301、302 和 307,则有重定向,读取http Headers 里的location值就是网址B。
      

  3.   

    请楼主说一下你是用的什么方式获取的这个网页?WebClient?WebRequest?还是其它的
      

  4.   

    建议你改成WebRequest吧,我做的时侯也是用的WebClient后来遇到URL重定向的问题了,跟主管商量了一下,发现WebResponse可以返回重定向的URL,全改成WebResponse了,WebClient恐怕够呛,至不我们没有找到解决办法,楼主如果找到了使用WebClient获取重定向的URL的也公布一下吧,嘿嘿
      

  5.   

    WebRequest比起WebClient也不复杂吧
    WebRequest request = WebRequest.Create(Url);
    WebResponse _WebResponse = request..GetResponse();
    Stream stream = _WebResponse.GetResponseStream();
      

  6.   

    webBrowser1.document.links("链接名").getAttribute("src")
      

  7.   

    不想用WebRequest.因为代码改动会很大.
      

  8.   

    这就是经验,如果一开始就用WebRequest的话也不会有现在的问题!我们那会改动也很大,可是没有办法,不改的话实现不了功能!楼主也可以想想别的办法,想到了也告诉我!据我们的经验,单依靠WebClient应该是实现不了这个功能,至少要重写WebClient!楼主看着办吧!
      

  9.   

    用ajax中的 xmlHttp对象返回全页面内容再处理。
      

  10.   

    用WebClient也不是没有办法的. 重写WebClient即可.类似以下
        /// <summary>
        /// 继承于WebClient
        /// </summary>
        public class MyWebClient
            : WebClient
        {
            /// <summary>
            /// 重写获取WebRequest的方法
            /// </summary>
            /// <param name="address"></param>
            /// <returns></returns>
            protected override WebRequest GetWebRequest(Uri address)
            {
                HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
                request.AllowAutoRedirect = false;  //这里不允许再继续跳转.否则取不到了
                return request;
            }
        }然后获取跳转地址的类似代码如下:
                string url = "http://dlc2.pconline.com.cn/filedown.jsp?dlid=49333&linkid=697658";
                string redirectUrl;
                //WebClient方式
                  WebClient client = new MyWebClient();
                client.Headers.Add("Referer", url);
                Stream stream = client.OpenRead(url); //一定要打开连接,要不然ResponseHeader是没有数据的
                //获取HTTP头
                redirectUrl = client.ResponseHeaders["Location"];
                stream.Close();
                client.Dispose();
      

  11.   

    如果是直接用WebRequest就简单多了
                //WebRequest方式
                string url = "http://dlc2.pconline.com.cn/filedown.jsp?dlid=49333&linkid=697658";
                string redirectUrl;
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Referer = url;              //来源地址,避免有些站是防盗链的
                request.AllowAutoRedirect = false;  //这里不允许再继续跳转.否则取不到了
                using (WebResponse response = request.GetResponse())
                {
                    redirectUrl = response.Headers["Location"];      //这里就是跳转地址了
                }
      

  12.   

    看样子只有用WebRequest了.
    但我没有改变之前的代码,只是在有可能网址重定向的地方调用下面这个函数.
    先这样解决了.        /// <summary>
            /// 获得重定向的Url
            /// </summary>
            /// <param name="originalAddress">原Url</param>
            /// <returns>重定向后的Url</returns>
            public static string GetTheRedirectUrl(string originalAddress)
            {
                string redirectUrl;
                WebRequest myRequest = WebRequest.Create(originalAddress);            WebResponse myResponse = myRequest.GetResponse();
                redirectUrl = myResponse.ResponseUri.ToString();            myResponse.Close();
                return redirectUrl;
            }
      

  13.   

    网页跳转不跳转,这个应该不好判断吧!如果在有可能地方调这个函数,那么这个可能条件怎么写呢你不能对计算机说,这个可能会跳转吧再说了这个条件真的能写出来的话,已经WebClient了一次,再来一次WebRequest,这个很影响效率,因为WebClient跟WebRequest是DownLoadData的时侯,如果不是异步方法的话,可是比较耗时间的,!在WebClient.DownLoadData()方法或WebRequest.GetResponse();设个断点,会发现程序会在这里停一下,时间长短取决于网络好坏。
    建议:
    1、拿出半天或更多的时间来把WebClient改成WebResponse
    2、把WebRequest改成异步方法,来提高效率。(在DownData等待的过程中可以做别的工作)
      

  14.   

    直接用WebBrowser控件就可以,它就相当于一个IE里面的连接直接点它自己就过去了,很方便的!!
      

  15.   

    最后还是觉得kingthy的重写webclient比较好.
    在此也特别感谢longfei_liuweitao的热心帮助,但因为我代码的问题,改成WebRequest实在很麻烦.
    结帖