我是Woocommerce网站和零售POS系统之间整合项目的中间人。 POS正在尝试将产品与Woocommerce商店同步。该站点具有SLL证书,因此所有通信都通过SSL进行。 POS供应商告诉我他们正在使用TLS1.2。我们有一个包含客户密钥和密码的网址,因此我无法在此处粘贴完整的网址,但问题如下......
直接粘贴到浏览器中的相同URL可以很好地工作,返回预期的JSON有效负载。与.NET WebClient或HttpClient一起使用的相同URL返回401 Not Authorized错误。以下是使用WebClient进行集成测试的示例;
[Test]
public void DownloadString_UsingWebClient_ReturnsNonEmptyResponse()
{
using (var client = new WebClient())
{
var response = client.DownloadString("https://demostore.mycompany.com.au/wp-json/wc/v2/settings/tax/woocommerce_prices_include_tax?consumer_key=ck_xxxskeyxxx&consumer_secret=cs_xxxsecretxxx");
Assert.IsNotEmpty(response);
}
}
这是一个使用HttpClient的类似测试;
[Test]
public async Task DownloadString_UsingHttpClient_ReturnsNonEmptyResponse()
{
using (var client = new HttpClient())
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var response = await client.GetStringAsync("https://demostore.mycompany.com.au/wp-json/wc/v2/settings/tax/woocommerce_prices_include_tax?consumer_key=ck_xxxskeyxxx&consumer_secret=cs_xxxsecretxxx"");
Assert.IsNotEmpty(response);
}
}
两个测试都没有进入Assert。重申一下,如果我使用相同的URL并将其粘贴到我的浏览器中,一切都按预期工作。我已经尝试了几个不同的东西,包括强制执行安全协议类型(如后一个例子中所示),但实际上它只是在黑暗中捅。
该网站使用的是最新版本的Wordpress,它位于共享的Linux托管环境中。
WebClient和HttpClient是否遗漏了一些东西?我是否回到网络托管公司并查看配置中是否存在阻止.NET客户端执行与浏览器相同的操作(我已经记录了此效果的支持请求,但是我是&m; m没有取得任何进展)?
答案 0 :(得分:0)
如果您在公司网络中并且浏览器正常运行而您的代码没有运行,那么您可能会错过WebClient
或{的代理设置{1}}实例。
我通常会将HttpClient
HttpClientHandler
和Preauthenticate = true
UseDefaultCredentials = true
实例传递给HttpClient
。
答案 1 :(得分:0)
我发现通常当某些内容在浏览器中运行时,但不在其外部时,这表明API依赖于请求中存在User-Agent
标头。
其中一个原因可能是该API前面的反向代理/防火墙。