Устранение неустойчивого поведения с помощью HttpWebRequest в SQL 2008 CLR UDF
-
21-08-2019 - |
Вопрос
В настоящее время мы пытаемся реализовать 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;
}