使用 Azure 数据工厂 Web activity returns 将表单数据发布到 C# 脚本的不同结果
POSTing form data using Azure data factory web activity returns different results to C# script
我已经到了扯头发的阶段了,我希望有人能看看我做错了什么。
我正在尝试 POST 使用 Azure 数据工厂网络 activity 将一些表单数据发送到网站 activity 但是当我收到响应时(我收到了页面和一些 headers)与使用 C# 和 HttpClient 代码发出 exact 相同请求时得到的响应不同。我使用 fiddler 查看正在使用我的 C# 脚本 post 的请求,根据数据工厂中给出的请求信息,它们完全相同 - 所以相同 headers,相同的内容格式等。 ..
此 POST 请求是为了登录到具有自定义登录机制的网站,因此不幸的是没有 OAuth 或类似的东西。它应该是 return 一个 cookie,如果我使用我的 C# 脚本它会这样做,但是如果我使用数据工厂网络 activity 发出相同的 POST 请求,那么我会得到不同的 html 发回(它只是 return 相同的登录屏幕)以及 activity 输出的“ADFWebActivityResponseHeaders”部分中的不同响应集 headers!?!请参阅下面的内容,了解网络中 return 编辑的内容 activity 输出响应 headers:-
"ADFWebActivityResponseHeaders": {
"Pragma": "no-cache",
"Vary": "Accept-Encoding",
"X-Frame-Options": "DENY",
"Cache-Control": "no-store, must-revalidate, no-cache, post-check=0, pre-check=0",
"Date": "Wed, 09 Sep 2020 08:09:30 GMT",
"Server": "Microsoft-IIS/8.5"
}
如果我通过 C# 执行此操作,我也会得到一个 'Set-Cookie'(奇怪的是,如果我对该站点的主页发出 'GET' 请求,我会得到一个 'Set-Cookie'响应!!!),但在通过数据工厂执行此操作时绝不会。除非数据工厂以某种方式修改我的请求,否则我很难看到这是怎么可能的?下面是我的 C# 代码,漂亮 simple/standard:-
var handler = new HttpClientHandler();
handler.CookieContainer = new CookieContainer();
handler.UseCookies = true;
handler.UseDefaultCredentials = false;
// Create our http client which will perform our web requests
var HttpClient = new HttpClient(handler);
HttpClient.BaseAddress = new Uri("**REMOVED**");
// Some of the extracts take a LONG time, so set the timeout for default of 30mins
HttpClient.Timeout = TimeSpan.FromMinutes(30);
// Set the 'form' parameters we're going to POST to the server in the request
var parameters = new Dictionary<string, string>
{
{ "username", "**REMOVED**" },
{ "password", "**REMOVED**" }
};
// URL encode the parameters
var content = new FormUrlEncodedContent(parameters);
// Submit our POST with the parameters
var response = await HttpClient.PostAsync("**REMOVED**", content);
运行 这段代码和使用提琴手我看到以下请求 headers,这些是唯一的 headers:-
Content-Length: 80
Content-Type: application/x-www-form-urlencoded
username=REMOVED&password=REMOVED
在网络的 'input' 端 activity 是请求的详细信息,我在网络 activity 中添加了 headers 这些是正确:-
"method": "POST",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": 80
},
"body": "username=REMOVED&password=REMOVED"
请注意,在数据工厂中,我使用的是自托管集成运行时,因为该网站阻止了并非来自我们 on-prem network/firewall 在外部使用的特定 IP 地址的地址。我知道这不是问题,因为我从站点收到了正常登录页面的响应(如果我使用 Azure 集成运行时,我会收到拒绝响应)。
这是数据工厂中的 Web activity 屏幕截图:-
真的希望有人能看到我遗漏了什么...
事实证明这确实有效,并且会在 activity 的 JSON 输出中列出 cookie,如下所示(请注意,这可以在 ADF [=34= 的输出中找到) ], 所以你会从输出中获取 cookie 有点像... @activity('Login and get cookie').output.ADFWebActivityResponseHeaders["Set-Cookie" ] )
但是,在我的例子中,我正在发布的 url 正在响应 302(暂时移动)但是应该存在的 'Location' header 不在 ADFWebActivityResponseHeaders 中- 这就是我错过它的原因。我尝试将 Chrome 与开发人员工具一起使用,并直接查看响应,这是我找到 302 响应代码的地方。之后,我只使用了在使用浏览器开发工具时发现的响应 header 中给出的新 URL(即 'Location' 中的 url)。
不幸的是,在撰写本文时,Azure 数据工厂 HTTP activity 不遵循重定向(也没有列出所有响应 header!)所以如果有人遇到同样的情况他们将需要 手动 找出并获取任何重定向的 url 的问题。换句话说,尝试使用 browser/postman 之类的工具,如果它在 ADF 中不起作用,请查看响应...您可能会发现正在进行重定向:-)
已记录此 here 的功能请求,请务必投票 :)
我已经到了扯头发的阶段了,我希望有人能看看我做错了什么。
我正在尝试 POST 使用 Azure 数据工厂网络 activity 将一些表单数据发送到网站 activity 但是当我收到响应时(我收到了页面和一些 headers)与使用 C# 和 HttpClient 代码发出 exact 相同请求时得到的响应不同。我使用 fiddler 查看正在使用我的 C# 脚本 post 的请求,根据数据工厂中给出的请求信息,它们完全相同 - 所以相同 headers,相同的内容格式等。 ..
此 POST 请求是为了登录到具有自定义登录机制的网站,因此不幸的是没有 OAuth 或类似的东西。它应该是 return 一个 cookie,如果我使用我的 C# 脚本它会这样做,但是如果我使用数据工厂网络 activity 发出相同的 POST 请求,那么我会得到不同的 html 发回(它只是 return 相同的登录屏幕)以及 activity 输出的“ADFWebActivityResponseHeaders”部分中的不同响应集 headers!?!请参阅下面的内容,了解网络中 return 编辑的内容 activity 输出响应 headers:-
"ADFWebActivityResponseHeaders": {
"Pragma": "no-cache",
"Vary": "Accept-Encoding",
"X-Frame-Options": "DENY",
"Cache-Control": "no-store, must-revalidate, no-cache, post-check=0, pre-check=0",
"Date": "Wed, 09 Sep 2020 08:09:30 GMT",
"Server": "Microsoft-IIS/8.5"
}
如果我通过 C# 执行此操作,我也会得到一个 'Set-Cookie'(奇怪的是,如果我对该站点的主页发出 'GET' 请求,我会得到一个 'Set-Cookie'响应!!!),但在通过数据工厂执行此操作时绝不会。除非数据工厂以某种方式修改我的请求,否则我很难看到这是怎么可能的?下面是我的 C# 代码,漂亮 simple/standard:-
var handler = new HttpClientHandler();
handler.CookieContainer = new CookieContainer();
handler.UseCookies = true;
handler.UseDefaultCredentials = false;
// Create our http client which will perform our web requests
var HttpClient = new HttpClient(handler);
HttpClient.BaseAddress = new Uri("**REMOVED**");
// Some of the extracts take a LONG time, so set the timeout for default of 30mins
HttpClient.Timeout = TimeSpan.FromMinutes(30);
// Set the 'form' parameters we're going to POST to the server in the request
var parameters = new Dictionary<string, string>
{
{ "username", "**REMOVED**" },
{ "password", "**REMOVED**" }
};
// URL encode the parameters
var content = new FormUrlEncodedContent(parameters);
// Submit our POST with the parameters
var response = await HttpClient.PostAsync("**REMOVED**", content);
运行 这段代码和使用提琴手我看到以下请求 headers,这些是唯一的 headers:-
Content-Length: 80
Content-Type: application/x-www-form-urlencoded
username=REMOVED&password=REMOVED
在网络的 'input' 端 activity 是请求的详细信息,我在网络 activity 中添加了 headers 这些是正确:-
"method": "POST",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": 80
},
"body": "username=REMOVED&password=REMOVED"
请注意,在数据工厂中,我使用的是自托管集成运行时,因为该网站阻止了并非来自我们 on-prem network/firewall 在外部使用的特定 IP 地址的地址。我知道这不是问题,因为我从站点收到了正常登录页面的响应(如果我使用 Azure 集成运行时,我会收到拒绝响应)。
这是数据工厂中的 Web activity 屏幕截图:-
真的希望有人能看到我遗漏了什么...
事实证明这确实有效,并且会在 activity 的 JSON 输出中列出 cookie,如下所示(请注意,这可以在 ADF [=34= 的输出中找到) ], 所以你会从输出中获取 cookie 有点像... @activity('Login and get cookie').output.ADFWebActivityResponseHeaders["Set-Cookie" ] )
但是,在我的例子中,我正在发布的 url 正在响应 302(暂时移动)但是应该存在的 'Location' header 不在 ADFWebActivityResponseHeaders 中- 这就是我错过它的原因。我尝试将 Chrome 与开发人员工具一起使用,并直接查看响应,这是我找到 302 响应代码的地方。之后,我只使用了在使用浏览器开发工具时发现的响应 header 中给出的新 URL(即 'Location' 中的 url)。
不幸的是,在撰写本文时,Azure 数据工厂 HTTP activity 不遵循重定向(也没有列出所有响应 header!)所以如果有人遇到同样的情况他们将需要 手动 找出并获取任何重定向的 url 的问题。换句话说,尝试使用 browser/postman 之类的工具,如果它在 ADF 中不起作用,请查看响应...您可能会发现正在进行重定向:-)
已记录此 here 的功能请求,请务必投票 :)