Pregunta

Medio ambiente: C #, .Net 3.5, SQL Server 2005

Tengo un método que funciona en un proyecto independiente de C # aplicación de consola. Se crea una XMLElement partir de los datos en la base de datos y utiliza un método privado para enviarlo a un servicio web en nuestra red local. Cuando se ejecuta desde VS en este proyecto de prueba, se ejecuta en <5 segundos.

copiar la clase en un proyecto CLR, lo construyó, y lo instaló en SQL Server (CON PERMISSION_SET = EXTERNAL_ACCESS). La única diferencia es la SqlContext.Pipe.Send () llama que he añadido para la depuración.

Estoy probando mediante el uso de un comando EXECUTE un procedimiento almacenado (en el CLR) desde la ventana de un SSMS consulta. Nunca regrese. Cuando dejo de ejecución de la llamada después de un minuto, lo último que se visualiza "Calling GetResponse () usando http: //servername:53694/odata.svc/Customers/ ". Alguna idea de por qué el () llamada GetResponse no vuelve al ejecutar dentro de SQL Server?

private static string SendPost(XElement entry, SqlString url, SqlString entityName)
{
    // Send the HTTP request
    string serviceURL = url.ToString() + entityName.ToString() + "/";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceURL);
    request.Method = "POST";
    request.Accept = "application/atom+xml,application/xml";
    request.ContentType = "application/atom+xml";
    request.Timeout = 20000;
    request.Proxy = null;

    using (var writer = XmlWriter.Create(request.GetRequestStream()))
    {
        entry.WriteTo(writer);
    }

    try
    {
        SqlContext.Pipe.Send("Calling GetResponse() using " + request.RequestUri);
        WebResponse response = request.GetResponse();
        SqlContext.Pipe.Send("Back from GetResponse()");

        /*
        string feedData = string.Empty;

        Stream stream = response.GetResponseStream();
        using (StreamReader streamReader = new StreamReader(stream))
        {
            feedData = streamReader.ReadToEnd();
        }
        */

        HttpStatusCode StatusCode = ((HttpWebResponse)response).StatusCode;
        response.Close();

        if (StatusCode == HttpStatusCode.Created /* 201 */ )
        {
            return "Created @ Location= " + response.Headers["Location"];
        }

        return "Creation failed; StatusCode=" + StatusCode.ToString();
    }
    catch (WebException ex)
    {
        return ex.Message.ToString();
    }
    finally
    {
        if (request != null)
            request.Abort();

    }
}
¿Fue útil?

Solución

El problema resultó ser la creación del contenido de la solicitud XML. El original:

using (var writer = XmlWriter.Create(request.GetRequestStream()))
{
    entry.WriteTo(writer);
}

La sustitución de trabajo:

    using (Stream requestStream = request.GetRequestStream())
    {
        using (var writer = XmlWriter.Create(requestStream))
        {
            entry.WriteTo(writer);
        }
    }

Otros consejos

Se necesita disponer el WebResponse. De lo contrario, después de unas cuantas llamadas se va a tiempo de espera.

Usted está buscando problemas haciendo esto en el CLR. Y se dice que está llamando esto desde un disparador? Esto pertenece en el nivel de aplicación.

cosas como esta es por eso que cuando la funcionalidad CLR salió, los administradores de bases estaban muy preocupados por la forma en que podría ser mal utilizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top