2

環境: 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();

    }
}
4

3 に答える 3

2

問題は、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);
        }
    }
于 2010-11-23T15:25:37.807 に答える
-1

CLRでこれを行うのに問題があります。そして、あなたはこれをトリガーから呼び出していると言いますか?これはアプリケーション層に属します。

このようなことが原因で、CLR 機能が登場したとき、DBA はそれがどのように悪用されるかを非常に懸念していました。

于 2010-11-19T21:09:02.593 に答える