0

現在、短縮 URL の展開を行うために SQL Server 2008 udf を実装しようとしています。ほとんどの主要な 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 のいずれかを返す関数を作成したいという私たちの希望を考慮して、何千もの縮小された 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 に答える