C# HttpClient和WebClient提供401错误,但浏览器中的直接链接仍然有效
我是Woocommerce网站和零售POS系统集成项目的中间人。POS正在尝试将产品与Woocommerce商店同步。该站点具有SLL证书,因此所有通信都通过SSL进行。POS供应商告诉我他们正在使用TLS1.2。我们有一个包含客户密钥和密码的URL,所以我不能在这里粘贴完整的URL,但问题如下 直接粘贴到浏览器中的相同URL工作得非常好,返回预期的JSON负载。与.NET WebClient或HttpClient一起使用的相同URL返回401未授权错误。下面是一个使用WebClient的集成测试示例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的集成测
[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;”);不是在公司网络中,但我一定会把这个放在一边,以备将来使用,谢谢。