Устранение ошибочного поведения с помощью HttpWebrequest в SQL 2008 CLR UDF - PullRequest
0 голосов
/ 21 марта 2009

В настоящее время мы пытаемся реализовать 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;

        }


    }
};

Ответы [ 2 ]

1 голос
/ 21 марта 2009

Вам не хватает wresp.Close ().

0 голосов
/ 21 марта 2009

Учитывая отзывы Джесси и наше желание иметь функцию, которая возвращает либо правильно расширенный 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;

}
...