Question

Environnement: C #, .Net 3.5, SQL Server 2005

J'ai une méthode qui fonctionne dans un C # autonome projet d'application de la console. Il crée un xmlelement à partir des données dans la base de données et utilise une méthode privée pour l'envoyer à un service Web sur notre réseau local. Lors de l'exécution de VS dans ce projet de test, il fonctionne en <5 secondes.

Je copié la classe dans un projet CLR, construit, et installé dans SQL Server (avec PERMISSION_SET = EXTERNAL_ACCESS). J'ai ajouté pour le débogage La seule différence est le SqlContext.Pipe.Send () appelle cela.

Je teste en utilisant une commande EXECUTE une procédure stockée (dans le CLR) depuis la fenêtre d'un SSMS. Il ne revient jamais. Quand j'arrête l'exécution de l'appel après une minute, la dernière chose affichée est « Appel GetResponse () en utilisant http: //servername:53694/odata.svc/Customers/ ». Toutes les idées pour lesquelles l'appel ne retourne pas GetResponse () lors de l'exécution dans 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();

    }
}
Était-ce utile?

La solution

Le problème est avéré être la création du contenu de la demande du XML. L'original:

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

Le remplacement de travail:

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

Autres conseils

Vous devez disposer WebResponse. Dans le cas contraire, après quelques appels, il va à délai d'attente.

Vous demandez du mal à faire cela dans le CLR. Et vous dites que vous appelez cela d'un déclencheur? Celui-ci appartient au niveau de l'application.

Des trucs comme c'est pourquoi lorsque la fonctionnalité CLR est sorti, CBM étaient très préoccupés par la façon dont il serait utilisé à mauvais escient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top