Frage

Umwelt: C #, .NET 3.5, SQL Server 2005

Ich habe eine Methode, die in einem eigenständigen C # -Konsolenanwendungsprojekt funktioniert. Es schafft eine XMLElement von Daten in der Datenbank und verwendet eine private Methode es zu einem Web-Service auf unserem lokalen Netzwerk zu senden. Wenn von VS in diesem Testprojekt ausführt, wird es in <5 Sekunden.

kopiert ich die Klasse in ein CLR-Projekt, baute es und installiert es in SQL Server (MIT PERMISSION_SET = EXTERNAL_ACCESS). Der einzige Unterschied ist die SqlContext.Pipe.Send () ruft, dass ich für das Debuggen hinzugefügt.

Ich teste es durch einen Befehl eine gespeicherte Prozedur ausführen mit (in der CLR) von einem SSMS Abfragefenster. Es gibt nie. Wenn ich die Ausführung des Anrufs nach einer Minute stoppen, angezeigt das letzte, was ist „Calling GetResponse () mit http: //servername:53694/odata.svc/Customers/ “. Irgendwelche Ideen, warum die GetResponse () -Aufruf nicht zurück, wenn innerhalb von SQL Server ausgeführt wird?

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();

    }
}
War es hilfreich?

Lösung

Das Problem erwies sich die Erstellung des Anforderungsinhalt aus dem XML zu sein. Das Original:

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

Der Arbeits Ersatz:

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

Andere Tipps

Sie müssen die WebResponse entsorgen. Ansonsten nach einigen Anrufen geht es zu Timeout.

Sie fordern Probleme dies in der CLR zu tun. Und Sie sagen, Sie dies von einem Trigger fordern? Das gehört in der Anwendungsebene.

Sachen wie das ist, warum, wenn die CLR-Funktionalität herauskommt, wurde DBAs sehr besorgt darüber, wie es missbraucht würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top