【问题标题】:POST JSON Data to web API in SSIS Script task from SQL在 SQL 的 SSIS 脚本任务中将 JSON 数据发布到 Web API
【发布时间】:2020-05-20 21:21:07
【问题描述】:

我一直在寻找这个问题的答案,但我一直没能找到答案,希望我能找到答案。诚然,我不是最好的 C# 程序员,这是出于需要,并且没有资源来帮助我开发它,所以我首先跳了起来。

如果我对 JSON 字符串进行硬编码,我有一些代码已成功将 JSON 数据发布到 API,但我想将 SQL 查询的结果设置为 OBJ,然后使用 NEWTONSOFT.JSON 将它们序列化以传递到 API 来代替硬编码的数据。

public void Main() {

        string url = Dts.Variables["$Package::url"].Value.ToString();
        string user = Dts.Variables["$Package::user"].Value.ToString();
        string pwd = Dts.Variables["$Package::pwd"].GetSensitiveValue().ToString();



        string result = Dts.Variables["User::JSON"].Value.ToString();
        var JsonResult = JsonConvert.SerializeObject(result);


        var request = (HttpWebRequest)WebRequest.Create(url);
        string authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(user + ":" + pwd));
        request.Headers.Add("Authorization", "Basic" + " " + authHeader);
        request.ContentType = "application/json";
        request.Accept = "application/json";
        request.Method = "POST";
        request.Headers.Add("Cookie: freedomIdentifyKey=XX");

         result.ToString();


        using (var streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            streamWriter.Write(JsonResult);
            streamWriter.Flush();
            streamWriter.Close();



            var httpResponse = (HttpWebResponse)request.GetResponse();



            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result2 = streamReader.ReadToEnd();
            }
        }



        Dts.TaskResult = (int)ScriptResults.Success;
    }

我不断收到错误:脚本任务中的 0x1:调用的目标已引发异常。

有什么想法可以解决这个问题吗?

【问题讨论】:

  • 首先我会使用 HttpClient 通过 HTTP 发送 JSON。您能否发布整个异常以及引发异常的行。
  • 为了按照迈克尔的要求去做。在您的代码中添加一个断点并单步执行。你会得到一个更好的错误信息。但如果我不得不猜测,我认为这将是序列化类中有一个 null。
  • 我添加了上面的完整代码来展示我是如何发送 JSON 包的。我还验证了没有 NULL 值是响应。通过在 SSMS 中运行查询。我正在从我的 Execute SQL 任务中保存完整的结果集,然后将该只读变量作为对象添加到我的脚本任务中......我可能会遗漏一些东西。
  • 我添加了断点,它似乎在流编写器中,但我只是得到同样的错误,没有更多信息。
  • 调试时要检查是否有inner-exception。 InvocationTargetException 只是告诉构造函数中发生了一些事情。

标签: c# json api ssis


【解决方案1】:

您不需要使用StreamWriter

string url = Dts.Variables["$Package::url"].Value.ToString();
string user = Dts.Variables["$Package::user"].Value.ToString();
string pwd = Dts.Variables["$Package::pwd"].GetSensitiveValue().ToString();
string result = Dts.Variables["User::JSON"].Value.ToString();

var JsonResult = JsonConvert.SerializeObject(result);

var request = (HttpWebRequest)WebRequest.Create(url);
string authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(user + ":" + pwd));
request.Headers.Add("Authorization", "Basic" + " " + authHeader);
request.ContentType = "application/json";
request.Accept = "application/json";
request.Method = "POST";
request.Headers.Add("Cookie: freedomIdentifyKey=XX");

using (var requestStream = request.GetRequestStream())
{
    requestStream.Write(JsonResult);

    using (var dataStream = response.GetResponseStream())
    {
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();
    }
}

如果你想改用 HttpClient:

string url = Dts.Variables["$Package::url"].Value.ToString();
string user = Dts.Variables["$Package::user"].Value.ToString();
string pwd = Dts.Variables["$Package::pwd"].GetSensitiveValue().ToString();
string result = Dts.Variables["User::JSON"].Value.ToString();

// HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
var client = new HttpClient();

// Call asynchronous network methods in a try/catch block to handle exceptions.
try 
{
   var response = await client.PostAsync(url, result);
   response.EnsureSuccessStatusCode();
   string responseBody = await response.Content.ReadAsStringAsync();
}
catch(HttpRequestException e)
{
   // do something
}

未测试

【讨论】:

    【解决方案2】:

    我能够解决这个问题。问题不在于代码,而在于 Newtonsoft.JSON 包。它甚至在到达代码之前就失败了,我试图将它作为 SQL 2016 目标运行。当我切换回 2019 年的项目时,它运行良好。为了让它像 2016 一样运行,我使用 GACUTIL 安装了 NEWTONSOFT.JSON,它现在运行良好。

    我确实进行了更改并在代码中使用了 SQL 查询,而不是使用执行 SQL 任务然后将其传递给变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-12
      • 2016-12-19
      • 2016-09-28
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多