C# HttpClient和WebClient提供401错误,但浏览器中的直接链接仍然有效

C# HttpClient和WebClient提供401错误,但浏览器中的直接链接仍然有效,c#,wordpress,woocommerce,httpclient,webclient,C#,Wordpress,Woocommerce,Httpclient,Webclient,我是Woocommerce网站和零售POS系统集成项目的中间人。POS正在尝试将产品与Woocommerce商店同步。该站点具有SLL证书,因此所有通信都通过SSL进行。POS供应商告诉我他们正在使用TLS1.2。我们有一个包含客户密钥和密码的URL,所以我不能在这里粘贴完整的URL,但问题如下 直接粘贴到浏览器中的相同URL工作得非常好,返回预期的JSON负载。与.NET WebClient或HttpClient一起使用的相同URL返回401未授权错误。下面是一个使用WebClient的集成测

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

直接粘贴到浏览器中的相同URL工作得非常好,返回预期的JSON负载。与.NET WebClient或HttpClient一起使用的相同URL返回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客户端执行与浏览器相同的操作的情况(我已经记录了这方面的支持票证,但没有任何进展)?

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


我通常将带有
Preauthenticate=true
UseDefaultCredentials=true
HttpClientHandler
实例传递给
HttpClient

我发现,通常当某些东西在浏览器中工作时,而不是在浏览器外部工作时,这表明API依赖于请求中存在的
用户代理


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

401意味着你需要授权,即你可能需要向你的请求添加身份验证cookie尝试添加
用户代理
头。哇-我不得不用谷歌搜索你俩的意思,但添加用户代理头成功了!现在,如果答案出现在@zaitsman?@Damo的评论中,我该如何标记它呢?让我添加它作为回答。只是为了澄清一下,我在WebClient示例中添加了这一行,它立即起到了作用;添加(“用户代理”、“Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.2;.NET CLR 1.0.3705;”);不是在公司网络中,但我一定会把这个放在一边,以备将来使用,谢谢。