2014-10-07 117 views
0

我有一个APIhttps://www.readability.com/developers/api/parser#idm386426118064)来提取webapges的内容,但传递一个缩短的URL或重定向到其他的url时,它会给出错误。如何获取缩短网址的目标网址?

我正在开发windows phone 8.1(xaml)应用程序。有什么方法可以在c#或任何解决方法中获取目标网址?

如网址 - http://www.bing.com/r/2/BB7Q4J4?a=1&m=EN-IN

+2

查看http://stackoverflow.com/questions/1382646/a-way-to-figure-out-redirection-url – artm 2014-10-07 03:31:59

+0

下面提出的'异步'解决方案是您可能需要的,详情请查看链接提供的@artm(同步版本,可能不会直接为WP工作)。 – 2014-10-07 03:40:54

回答

4

你可以拦截Location头值的HttpClient遵循它像这样前:

using (var handler = new HttpClientHandler()) 
{ 
    handler.AllowAutoRedirect = false; 
    using (var client = new HttpClient(handler)) 
    { 
     var response = await client.GetAsync("shortUrl"); 
     var longUrl = response.Headers.Location.ToString(); 
    } 
} 

该解决方案将永远是最有效的,因为它只能发出一个请求。

但是,有可能短url会引用另一个短url,并因此导致此方法失败。

另一种解决办法是允许HttpClient跟随Location头值并观察目的地:

using (var client = new HttpClient()) 
{ 
    var response = client.GetAsync("shortUrl").Result; 
    var longUrl = response.RequestMessage.RequestUri; 
} 

这种方法是既大于第一更简洁和更可靠。

缺点是此代码将发出两个请求,而不是一个。

1

你可以得到的GetResponse()的ResponseUri:

string redirectedURL = WebRequest.Create("http://www.bing.com/r/2/BB7Q4J4?a=1&m=EN-IN") 
           .GetResponse() 
           .ResponseUri 
           .ToString(); 

有趣的文章,顺便说一句。

-1

您需要检查从URL返回的标头。

如果您获得HTTP返回码301或302,则会通知您该页面将您重定向到另一个URL。

有关HTTP返回码的更多详细信息,请参阅http://www.w3.org/Protocols/HTTP/HTRESP.html