为什么SQL Server的CLR过程中航的GetResponse()调用Web服务
-
26-09-2019 - |
题
环境: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功能出来,数据库管理员非常关心它是如何被滥用。
不隶属于 StackOverflow