在C#中使用WebClient有没有办法在重定向后获取站点的URL?

Mat*_*one 41 .net c# regex http

使用WebClient类,我可以轻松地获得网站的标题:

WebClient x = new WebClient();    
string source = x.DownloadString(s);
string title = Regex.Match(source, 
    @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>",
    RegexOptions.IgnoreCase).Groups["Title"].Value;
Run Code Online (Sandbox Code Playgroud)

我想存储URL和页面标题.但是,当遵循以下链接时:

http://tinyurl.com/dbysxp

我显然想要将我重定向到的Url.

质询

有没有办法在WebClient课堂上这样做?

我怎么用HttpResponseHttpRequest

Wil*_*ean 66

如果我理解这个问题,那就比人们说的容易得多 - 如果你想让WebClient做所有请求的细节(包括重定向),但是最后得到实际的响应URI,你可以继承WebClient像这样:

class MyWebClient : WebClient
{
    Uri _responseUri;

    public Uri ResponseUri
    {
        get { return _responseUri; }
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        _responseUri = response.ResponseUri;
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

只需在使用WebClient的任何地方使用MyWebClient即可.在完成了您需要做的任何WebClient调用之后,您可以使用ResponseUri来获取实际重定向的URI. 如果您使用异步内容,则还需要为GetWebResponse(WebRequest请求,IAsyncResult结果)添加类似的覆盖.

  • @GabrielBB - GetWebResponse受到保护,因此除了在WebClient的子类中之外,您无法访问它. (7认同)
  • 如果您正在下载异步(例如,使用`DownloadStringAsync`),这将无效,但它适用于同步调用. (2认同)

Why*_*ous 16

我知道这已经是一个已经回答的问题了,但这对我很有用:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tinyurl.com/dbysxp");
 request.AllowAutoRedirect = false;
 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 string redirUrl = response.Headers["Location"];
 response.Close();

 //Show the redirected url
 MessageBox.Show("You're being redirected to: "+redirUrl);
Run Code Online (Sandbox Code Playgroud)

干杯.!;)

  • 最后调用`response.close()`(或使用`using`语句)至关重要.有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse(v=vs.110).aspx.否则,多次执行此代码时可能会耗尽连接或超时. (2认同)

cas*_*One 6

使用HttpWebRequest,您可以将AllowAutoRedirect属性设置为false.发生这种情况时,状态代码在300-399之间的任何响应都不会自动重定向.

然后,您可以从响应标头中获取新URL,然后为新URL创建新HttpWebRequest实例.

有了这个WebClient课程,我怀疑你可以开箱即用,所以它不允许重定向.你可以做的是从WebClient类派生一个类,然后重写GetWebRequestGetWebResponse改变基实现返回的WebRequest/ WebResponse实例的方法; 如果是HttpWebRequest,则将AllowAutoRedirect属性设置为false.在响应中,如果状态代码在300-399范围内,则发出新请求.

但是,我不知道您可以从GetWebRequest/ GetWebResponsemethods中发出新请求,因此最好只使用HttpWebRequest/ 执行循环,HttpWebResponse直到遵循所有重定向.