環境: C#、.Net 3.5、Sql Server 2005
スタンドアロンの C# コンソール アプリケーション プロジェクトで機能するメソッドがあります。データベース内のデータから XMLElement を作成し、プライベート メソッドを使用してそれをローカル ネットワーク上の Web サービスに送信します。このテスト プロジェクトで VS から実行すると、5 秒未満で実行されます。
クラスを CLR プロジェクトにコピーしてビルドし、SQL Server にインストールしました (WITH PERMISSION_SET = EXTERNAL_ACCESS)。唯一の違いは、デバッグ用に追加した SqlContext.Pipe.Send() 呼び出しです。
SSMSクエリウィンドウからEXECUTEコマンドの1つのストアドプロシージャ(CLR内)を使用してテストしています。それは二度と戻りません。1 分後に呼び出しの実行を停止すると、最後に「 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();
}
}