0

我们目前正在尝试实施 sql server 2008 udf 来扩展缩短的 url。我们让它对大多数主要的 URL 缩短服务都非常有效。但是,在看似随机的时间,它会“挂起”并拒绝针对某个域(例如 bit.ly)工作,而随后对其他服务的调用(例如 tinyurl.com)将继续成功。

我们最初认为这是由于 url 缩短提供程序的某种阻塞,但停止并重新启动 dbserver 服务会导致后续请求成功。会不会是 SQL 服务器以某种方式汇集了传出的 http 连接?

这是代码...

using System;
using System.Data;
using System.Net;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString UrlExpander(string url)
    {
            // Set up the Webrequest
            HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url);
            try
            {

            // Set autoredirect off so the redirected URL will not be loaded
            wr.AllowAutoRedirect = false;

            // Get the response
            HttpWebResponse wresp = (HttpWebResponse)wr.GetResponse();

            return new SqlString(wresp.Headers["Location"].ToString());
        }
        catch (Exception ex)
        {
            wr.Abort();
            throw ex;

        }


    }
};
4

2 回答 2

1

您缺少 wresp.Close()。

于 2009-03-21T02:27:37.197 回答
0

鉴于 Jesse 的反馈以及我们希望拥有一个返回正确扩展的 url 或 NULL 的函数,我们提出了以下方法,它似乎可以处理 1000 多个缩小的 URL,而没有进一步的问题:

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString UrlExpander(string url)
{
    // Set up the Webrequest
    try
    {
        HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url);
        try
        {
            // Set autoredirect off so the redirected URL will not be loaded
            wr.AllowAutoRedirect = false;

            // Get the response
            HttpWebResponse wresp = (HttpWebResponse)wr.GetResponse();
            wresp.Close();

            if (wresp != null)
                return new SqlString(wresp.Headers["Location"].ToString());
        }
        finally
        {
            if (wr != null)
                wr.Abort();
        }
    }
    catch
    {
    }

    return null;

}
于 2009-03-21T16:10:42.040 回答