环境:C#,净3.5,SQL Server 2005的

我有一个单独的C#控制台应用程序项目工程的方法。它创建从数据库中的数据的XMLElement和使用私有方法将其发送到Web服务我们的本地网络上。当从VS在这个测试项目中运行,它运行在<5秒。

我复制的类成CLR项目,建立了它,并且在SQL Server(WITH PERMISSION_SET = EXTERNAL_ACCESS)安装它。唯一的区别是所述SqlContext.Pipe.Send()调用我添加用于调试。

我通过使用从SSMS查询窗口执行命令一个存储过程(在CLR)测试它。它永远不会返回。当我一分钟后停止呼叫的执行,最后一件事是显示“调用的GetResponse()使用 HTTP: //servername:53694/odata.svc/Customers/ ”。任何想法,为什么SQL Server的?

中执行时的GetResponse()调用不返回
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();

    }
}
有帮助吗?

解决方案

在问题原来是从XML请求内容的创建。原:

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

工作替换:

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

其他提示

您需要处置WebResponse的。否则,过了几个电话就转到超时。

您所要求的在CLR这样的麻烦。你说你是从一个触发器调用此?这属于在应用程序层。

东西一样,这就是为什么当CLR功能出来,数据库管理员非常关心它是如何被滥用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top