Устранение неустойчивого поведения с помощью HttpWebRequest в SQL 2008 CLR UDF

StackOverflow https://stackoverflow.com/questions/668617

Вопрос

В настоящее время мы пытаемся реализовать udf sql server 2008 для расширения сокращенных URL-адресов.У нас это довольно хорошо работает с большинством основных сервисов по сокращению URL-адресов.Однако в кажущиеся случайными моменты времени он будет "зависать" и откажется работать с определенным доменом (например, bit.ly), в то время как последующие вызовы других служб (например, tinyurl.com) будут по-прежнему успешными.

Первоначально мы думали, что это связано с какой-то блокировкой поставщиком сокращения URL-адресов, но остановка и перезапуск службы dbserver приводят к успешному завершению последующих запросов.Может ли быть так, что SQL server каким-то образом объединяет исходящие 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;

        }


    }
};
Это было полезно?

Решение

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

Другие советы

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top