Domanda

Al momento stiamo cercando di implementare un SQL Server 2008 UDF per fare l'espansione di URL abbreviati. Abbiamo funzionare abbastanza bene contro la maggior parte dei principali servizi di accorciamento URL. Tuttavia, a volte apparentemente casuali sarà "blocco" e si rifiutano di lavorare contro un certo dominio (ad esempio bit.ly), mentre le chiamate successive ad altri servizi (ad esempio tinyurl.com) continueranno ad avere successo.

Inizialmente abbiamo pensato che questo era a causa di una sorta di blocco da parte del fornitore di accorciamento URL, ma l'arresto e il riavvio del servizio dbserver causa successive richieste per avere successo. Potrebbe essere che SQL Server è in qualche modo messa in comune le connessioni HTTP in uscita in qualche modo?

Ecco il codice ...

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;

        }


    }
};
È stato utile?

Soluzione

Ti manca wresp.Close ().

Altri suggerimenti

Dato il feedback da Jesse e il nostro desiderio di avere una funzione che restituisce un URL o NULL correttamente espanso, siamo venuti con la seguente, che sembra per elaborare 1000 di URL minified senza ulteriori problemi:

[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;

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top