web-services - 为什么 SQL Server CLR 过程在对 Web 服务的 GetResponse() 调用中挂起

标签 web-services sql-server-2005 sqlclr clrstoredprocedure getresponse

环境:C#、.Net 3.5、Sql Server 2005

我有一个适用于独立 C# 控制台应用程序项目的方法。它根据数据库中的数据创建 XMLElement,并使用私有(private)方法将其发送到本地网络上的 Web 服务。当在此测试项目中从 VS 运行时,它的运行时间不到 5 秒。

我将该类复制到 CLR 项目中,构建它,并将其安装在 SQL Server 中(WITH PERMISSION_SET = EXTERNAL_ACCESS)。唯一的区别是我为调试添加的 SqlContext.Pipe.Send() 调用。

我正在通过从 SSMS 查询窗口使用 EXECUTE 命令一个存储过程(在 CLR 中)来测试它。它永远不会回来。当我在一分钟后停止执行调用时,显示的最后一件事是“使用 http://servername:53694/odata.svc/Customers/ 调用 GetResponse() ”。关于为什么 GetResponse() 调用在 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();

    }
}

最佳答案

问题出在从 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);
        }
    }

关于web-services - 为什么 SQL Server CLR 过程在对 Web 服务的 GetResponse() 调用中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229185/

相关文章:

iphone - 使用 Soundcloud API OAuth2 时出现 401 错误代码

java - 部分项目不在 Tomcat 6 上运行

visual-studio - 如何将旧的 Visual Studio 项目迁移到 Visual Studio 2017?

c# - 在 SQL-CLR 触发器或存储过程中创建套接字

php - 使用 Netsuite PHP 工具包搜索按客户过滤的销售订单

JQuery - 每 2 秒单击一次按钮

sql - 按行获取多个指标的总和

sql - SQL 查询中前 10 行的问题?

c# - 本地 ASP.NET MVC 突然变慢;加载时间 > 1 分钟

tsql - t-sql 中的正确/标题案例