質問

環境: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コマンドの1つのストアドプロシージャを使用して、それをテストしています。それは戻ることはありません。私は分後にコールの実行を停止すると、最後のものは、「 HTTPを使用して)(のGetResponseを呼び出すされ、表示されます: //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の機能が出てきたとき、DBAは非常にそれが悪用されるだろうか心配だった理由は、このようなものがある。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top