c#如何获取跳转后的网址(winform) 用c#分析一个网页.但这个地址是指向另外一个地址的.也就是访问网址A,网址A会转向网址B.c#里面如何写一个函数,通过输入网址A,来获取网址B.谢谢各位,解决后立即给分. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用WebRequest获取那个网页,在获取得WebResponse里面有一个ResponseUri,这个就是跳转后的地址 如果http响应的StatusCode 为301、302 和 307,则有重定向,读取http Headers 里的location值就是网址B。 请楼主说一下你是用的什么方式获取的这个网页?WebClient?WebRequest?还是其它的 建议你改成WebRequest吧,我做的时侯也是用的WebClient后来遇到URL重定向的问题了,跟主管商量了一下,发现WebResponse可以返回重定向的URL,全改成WebResponse了,WebClient恐怕够呛,至不我们没有找到解决办法,楼主如果找到了使用WebClient获取重定向的URL的也公布一下吧,嘿嘿 WebRequest比起WebClient也不复杂吧WebRequest request = WebRequest.Create(Url);WebResponse _WebResponse = request..GetResponse();Stream stream = _WebResponse.GetResponseStream(); webBrowser1.document.links("链接名").getAttribute("src") 不想用WebRequest.因为代码改动会很大. 这就是经验,如果一开始就用WebRequest的话也不会有现在的问题!我们那会改动也很大,可是没有办法,不改的话实现不了功能!楼主也可以想想别的办法,想到了也告诉我!据我们的经验,单依靠WebClient应该是实现不了这个功能,至少要重写WebClient!楼主看着办吧! 用ajax中的 xmlHttp对象返回全页面内容再处理。 用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(); 如果是直接用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"]; //这里就是跳转地址了 } 看样子只有用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; } 网页跳转不跳转,这个应该不好判断吧!如果在有可能地方调这个函数,那么这个可能条件怎么写呢你不能对计算机说,这个可能会跳转吧再说了这个条件真的能写出来的话,已经WebClient了一次,再来一次WebRequest,这个很影响效率,因为WebClient跟WebRequest是DownLoadData的时侯,如果不是异步方法的话,可是比较耗时间的,!在WebClient.DownLoadData()方法或WebRequest.GetResponse();设个断点,会发现程序会在这里停一下,时间长短取决于网络好坏。建议:1、拿出半天或更多的时间来把WebClient改成WebResponse2、把WebRequest改成异步方法,来提高效率。(在DownData等待的过程中可以做别的工作) 直接用WebBrowser控件就可以,它就相当于一个IE里面的连接直接点它自己就过去了,很方便的!! 最后还是觉得kingthy的重写webclient比较好.在此也特别感谢longfei_liuweitao的热心帮助,但因为我代码的问题,改成WebRequest实在很麻烦.结帖 两个无关联窗体里的文本框之间怎么传值? 如果引用自己不熟悉的dll文件会不会中毒呢? 如何获得输入后Textbox的內容 C# EXCEL导出到csv文件 请用C#写一个String的COPY函数。 文字转ASCII问题!回答就有分!高手进!给参考例子的话连昨天100分一起给 com主件调用问题 右键问题:请问我调出来的CONTEXMENU为什么是灰色的,不能点击呢? .net 2.0环境 richtextBox替换 为什么不能给SelectParameters动态赋值 校验和 问题,无进位累加和怎么实现!!!
WebRequest request = WebRequest.Create(Url);
WebResponse _WebResponse = request..GetResponse();
Stream stream = _WebResponse.GetResponseStream();
/// <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();
//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"]; //这里就是跳转地址了
}
但我没有改变之前的代码,只是在有可能网址重定向的地方调用下面这个函数.
先这样解决了. /// <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;
}
建议:
1、拿出半天或更多的时间来把WebClient改成WebResponse
2、把WebRequest改成异步方法,来提高效率。(在DownData等待的过程中可以做别的工作)
在此也特别感谢longfei_liuweitao的热心帮助,但因为我代码的问题,改成WebRequest实在很麻烦.
结帖