Pergunta

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

Eu tenho um método que funciona em um projeto de aplicativo de console C# independente. Ele cria um XMLELEMENT da Data no banco de dados e usa um método privado para enviá -lo para um serviço da Web em nossa rede local. Quando executado do VS neste projeto de teste, ele é executado em <5 segundos.

Copiei a classe em um projeto CLR, construí e instalei -o no SQL Server (com permissão_set = extern_access). A única diferença é o sqlcontext.pipe.send () chamadas que eu adicionei para depuração.

Estou testando -o usando um comando execute um procedimento armazenado (no CLR) a partir de uma janela de consulta SSMS. Nunca retorna. Quando paro de execução da chamada depois de um minuto, a última coisa exibida é "Calling getResponse () usando http: // servername: 53694/odata.svc/clientes/". Alguma idéia sobre por que a chamada getResponse () não retorna ao executar no 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();

    }
}
Foi útil?

Solução

O problema acabou sendo a criação do conteúdo da solicitação a partir do XML. O original:

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

A substituição de trabalho:

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

Outras dicas

Você precisa descartar a resposta da Webrest. Caso contrário, depois de algumas chamadas, isso vai para o tempo limite.

Você está pedindo problemas para fazer isso no CLR. E você diz que está chamando isso de um gatilho? Isso pertence à camada do aplicativo.

Coisas assim é por isso que, quando a funcionalidade do CLR saiu, os dbas estavam muito preocupados com a forma como seria mal utilizada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top