环境:C#、.Net 3.5、Sql Server 2005
我有一个适用于独立 C# 控制台应用程序项目的方法。它从数据库中的数据创建一个 XMLElement,并使用私有方法将其发送到我们本地网络上的 Web 服务。在这个测试项目中从 VS 运行时,它的运行时间 < 5 秒。
我将该类复制到 CLR 项目中,构建它,并将其安装在 SQL Server 中(WITH PERMISSION_SET = EXTERNAL_ACCESS)。唯一的区别是我为调试添加的 SqlContext.Pipe.Send() 调用。
我正在使用 SSMS 查询窗口中的一个存储过程(在 CLR 中)使用 EXECUTE 命令对其进行测试。它永远不会回来。当我在一分钟后停止执行调用时,显示的最后一件事是“使用http://servername:53694/odata.svc/Customers/调用 GetResponse() ”。关于为什么在 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();
}
}