【发布时间】:2017-11-21 10:33:56
【问题描述】:
我是 Woocommerce 网站和零售 POS 系统之间集成项目的中间人。 POS 正在尝试将产品与 Woocommerce 商店同步。该站点具有 SLL 证书,因此所有通信都通过 SSL。 POS 供应商告诉我他们正在使用 TLS1.2。我们有一个包含客户密钥和秘密的 URL,所以我无法在此处粘贴完整的 URL,但问题如下...
直接粘贴到浏览器中的相同 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 客户端执行与浏览器相同的内容(我已经记录了支持票证,但我没有得到有什么进展吗)?
【问题讨论】:
-
401 表示您需要授权,即您可能需要将身份验证 cookie 添加到您的请求中
-
尝试添加
User-Agent标头。 -
哇——我不得不用谷歌搜索你们俩的意思,但是添加用户代理标头就可以了!现在,如果答案在 cmets @zaitsman 中,我该如何标记?
-
@Damo 让我添加它作为答案
-
为了澄清,我将这一行添加到 WebClient 示例中,它立即起作用; client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
标签: c# wordpress woocommerce httpclient webclient