我需要获取缩短网址的最终目的地的网址。目前我正在做以下工作似乎有效:
var request = WebRequest.Create(shortenedUri);
var response = request.GetResponse();
return response.ResponseUri;
但是,有人可以提出更好的方法吗?
答案 0 :(得分:4)
如果这个缩短的网址是由某个在线服务提供商生成的,则只有该服务提供商存储短网址和实际网址之间的映射。因此,您需要通过向其发送HTTP请求来查询此提供程序,就像您一样。另外,不要忘记通过将IDisposable资源包装在using
语句中来正确处理它们:
var request = WebRequest.Create(shortenedUri);
using (var response = request.GetResponse())
{
return response.ResponseUri;
}
如果服务提供商支持HEAD动词,您也可以使用此动词并读取必须指向实际URL的位置响应HTTP标头。作为替代方法,您可以在请求对象上将AllowAutoRedirect属性设置为false,然后读取位置响应HTTP标头。这样,当您对它不感兴趣时,客户端将不会重定向到实际资源并获取整个响应正文。
当然,最好的方法是,如果您的在线服务提供商提供的API允许您直接从短网址中提供实际网址。
答案 1 :(得分:2)
您确实需要发出HTTP请求 - 但您无需遵循重定向,WebRequest
默认情况下会执行重定向。以下是使只有一个请求的简短示例:
using System;
using System.Net;
class Test
{
static void Main()
{
string url = "http://tinyurl.com/so-hints";
Console.WriteLine(LengthenUrl(url));
}
static string LengthenUrl(string url)
{
var request = WebRequest.CreateHttp(url);
request.AllowAutoRedirect = false;
using (var response = request.GetResponse())
{
var status = ((HttpWebResponse) response).StatusCode;
if (status == HttpStatusCode.Moved ||
status == HttpStatusCode.MovedPermanently)
{
return response.Headers["Location"];
}
// TODO: Work out a better exception
throw new Exception("No redirect required.");
}
}
}
请注意,这意味着如果“加长”网址本身重定向,您将无法获得原始代码中的“最终”URI。同样,如果加长的URL无效,您将不会发现 - 您只需获取您将重定向到的URL。这是否是好事取决于您的用例...