【问题标题】:HttpClient and WebClient give 401 error yet direct link in browser worksHttpClient 和 WebClient 给出 401 错误但浏览器中的直接链接有效
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 不在公司网络中,但我一定会把这个放在一边以备将来使用,谢谢。
【解决方案2】:

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

其中一个原因可能是该 API 前面的反向代理/防火墙。

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2019-09-08
    • 2011-10-06
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多