SSIS 脚本:HTTPWebRequest 和 Webclient.Downloadfile 在部分 Uri 上失败

SSIS Script: HTTPWebRequest and Webclient.Downloadfile failing on part of Uri

我正在尝试从 API 下载一个文件,该文件在 chrome 中运行良好,使用以下 Url:

https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/namq_10_pc/.CP_EUR_HAB.NSA.B1GQ.?startPeriod=2017&format=SDMX_2.1_STRUCTURED

但是,当我尝试使用 HTTPWebRequestWebclient.Downloadfile 在 SSIS 中的 c# 脚本中下载它时失败(404 响应错误)。

在搜索 Whosebug 数小时后,尝试了多种方法,我发现如果我删除 Url:

的一部分,这两种方法都有效

https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/namq_10_pc/?startPeriod=2017&format=SDMX_2.1_STRUCTURED

为什么包含“.CP_EUR_HAB.NSA.B1GQ.”让它在 c# 中失败,但在 chrome?

中不会

我使用的代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(sourceFilePath));
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (Stream file = File.Create(savePathAndName))
{
     CopyStream(stream, file);
}

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8 * 1024];
    int len;
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
         output.Write(buffer, 0, len);
    }
}

更新 最初,SSIS 被省略了,因为我认为它是无关紧要的,但是,在评论说他们可以让它工作之后,我测试了 Uri 返回的内容,它删除了问号前的最后一个点:

https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/namq_10_pc/.CP_EUR_HAB.NSA.B1GQ?startPeriod=2017&format=SDMX_2.1_STRUCTURED

在获取这些点段时有许多记录在案的困难:只有几个包括:

Is there a way to keep dot segments in url using Uri class?A url resource that is a dot (%2E)

如果那个点不存在,API returns 失败。微软证实了这一点:

https://docs.microsoft.com/en-us/dotnet/api/system.uri?view=net-5.0

经过一些调查,这似乎与框架有关,更新它可能是答案,这可能表明为什么其他人可以在 SSIS 中实现此功能,但我却不行。 SSIS 2017 使用的框架绑定到 4.5。我在想我可能在这方面走投无路了。

它是“.CP_EUR_HAB.NSA.B1GQ”部分的尾随点。那是导致问题的原因。 Uri 会自动删除点段,看来没有办法解决这个问题。

在 SSIS 207 中使用它,我无法更改目标框架,Microsoft 现在将其与 SSIS 版本相关联。

解决方案是不用尾随的“.”。 API 需要指定国家通配符,我不得不在 URL:

中列出每个国家代码

https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/namq_10_pc/.CP_EUR_HAB.NSA.B1GQ.UK+BE+BG+CZ+DK+DE+EE+IE+EL+ES+FR+HR+IT+CY+LV+LT+LU+HU+MT+NL+AT+PL+PT+RO+SI+SK+FI+SE+IS+NO+CH+ME+MK+AL+RS+TR+BA+XK?startPeriod=2017&format=SDMX_2.1_STRUCTURED