SSIS 脚本:HTTPWebRequest 和 Webclient.Downloadfile 在部分 Uri 上失败
SSIS Script: HTTPWebRequest and Webclient.Downloadfile failing on part of Uri
我正在尝试从 API 下载一个文件,该文件在 chrome 中运行良好,使用以下 Url:
但是,当我尝试使用 HTTPWebRequest
或 Webclient.Downloadfile
在 SSIS 中的 c# 脚本中下载它时失败(404 响应错误)。
在搜索 Whosebug 数小时后,尝试了多种方法,我发现如果我删除 Url:
的一部分,这两种方法都有效
为什么包含“.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 返回的内容,它删除了问号前的最后一个点:
在获取这些点段时有许多记录在案的困难:只有几个包括:
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:
中列出每个国家代码
我正在尝试从 API 下载一个文件,该文件在 chrome 中运行良好,使用以下 Url:
但是,当我尝试使用 HTTPWebRequest
或 Webclient.Downloadfile
在 SSIS 中的 c# 脚本中下载它时失败(404 响应错误)。
在搜索 Whosebug 数小时后,尝试了多种方法,我发现如果我删除 Url:
的一部分,这两种方法都有效为什么包含“.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 返回的内容,它删除了问号前的最后一个点:
在获取这些点段时有许多记录在案的困难:只有几个包括:
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:
中列出每个国家代码