HttpClient 和 WebClient 给出 401 错误但直接 link 在浏览器中工作

HttpClient and WebClient give 401 error yet direct link in browser works

我是 Woocommerce 网站和零售 POS 系统之间集成项目的中间人。 POS 正在尝试将产品与 Woocommerce 商店同步。该站点具有 SLL 证书,因此所有通信都通过 SSL。 POS 供应商告诉我他们正在使用 TLS1.2。我们有一个包含客户密钥和机密的 URL,所以我无法在此处粘贴完整的 URL,但问题如下...

直接粘贴到浏览器中的相同 URL 运行良好,返回预期的 JSON 负载。同样 URL 用于 .NET WebClient 或 HttpClient returns 401 未授权错误。这是使用 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);
    }

}

这两个测试都没有进入断言。重申一下,如果我采用相同的 URL 并将其粘贴到我的浏览器中,一切都会按预期进行。我已经尝试了几种不同的方法,包括强制执行安全协议类型(如后一个示例所示),但实际上这只是在黑暗中戳一戳。

该网站正在使用最新版本的 Wordpress,并且处于共享 linux 托管环境中。

WebClient 和 HttpClient 是否遗漏了什么?我是否要返回 Web 托管公司并查明配置中是否有某些内容会阻止 .NET 客户端执行与浏览器相同的操作(我已经为此效果记录了支持票证,但我没有得到有进展吗)?

如果您在公司网络中并且浏览器可以正常工作而您的代码不正常,则可能是您缺少 WebClientHttpClient 实例的代理设置。

我通常将带有 Preauthenticate = trueUseDefaultCredentials = trueHttpClientHandler 实例传递给 HttpClient

我发现通常当某些东西在浏览器中工作时,但在浏览器之外不工作时,这表明 API 依赖于请求中存在的 User-Agent header。

其中一个原因可能是 API 前面有一个 reverse-proxy/firewall。