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

时间:2017-11-21 10:33:56

标签: c# wordpress woocommerce httpclient webclient

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

直接粘贴到浏览器中的相同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客户端执行与浏览器相同的操作(我已经记录了此效果的支持请求,但是我是&m; m没有取得任何进展)?

2 个答案:

答案 0 :(得分:0)

如果您在公司网络中并且浏览器正常运行而您的代码没有运行,那么您可能会错过WebClient或{的代理设置{1}}实例。

我通常会将HttpClient HttpClientHandlerPreauthenticate = true UseDefaultCredentials = true实例传递给HttpClient

答案 1 :(得分:0)

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

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