1

我需要获取缩短网址的最终目的地的网址。目前,我正在执行以下似乎可行的操作:

        var request = WebRequest.Create(shortenedUri);
        var response = request.GetResponse();
        return response.ResponseUri;

但是有人可以提出更好的方法吗?

4

2 回答 2

4

如果这个缩短的 url 是由某个在线服务提供商生成的,那么只有这个服务提供商会存储短 url 和实际 url 之间的映射。所以你需要通过向它发送一个 HTTP 请求来查询这个提供者,就像你做的那样。也不要忘记通过将 IDisposable 资源包装在using语句中来正确处理它们:

var request = WebRequest.Create(shortenedUri);
using (var response = request.GetResponse())
{
    return response.ResponseUri;
}

如果服务提供商支持 HEAD 动词,您也可以使用该动词并读取必须指向实际 url 的 Location 响应 HTTP 标头。作为替代方案,您可以在请求对象上将AllowAutoRedirect属性设置为 false,然后读取 Location 响应 HTTP 标头。这样,当您对它不感兴趣时​​,客户端将不会重定向到实际资源并获取整个响应正文。

当然,最好的方法是如果您的在线服务提供商提供一个 API,允许您直接从短网址中为您提供实际网址。

于 2012-11-20T13:22:23.193 回答
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.");
        }
    }
}

请注意,这意味着如果“加长”URL本身就是一个重定向,那么您将不会像在原始代码中那样获得“最终”URI。同样,如果加长的 URL 无效,您将不会发现 - 您只会得到您将重定向到的 URL。这是否是一件好事取决于您的用例......

于 2012-11-20T13:33:21.093 回答