403禁止使用WebClient

时间:2020-01-24 16:56:49

标签: c# webclient

我工作的公司的互联网连接受到限制,我们使用代理服务器(例如:10.10.10.10:8080)访问某些受限连接。

我可以在Postman中使用API​​(将代理置于Postman设置中),但是在输入C#WebClient代码时会出现403-Forbidden错误。

我只需要var sensorData字段,但是我分为var datavar data2来了解问题出在哪里。它给了我var data = ...

处的错误
Uri uri = new Uri("https://XXXXXXXX/api/DatasourceData/DatasourceDataHistoryBySerialNumber/");
Token token = new Token();
token = GetToken(tokenAPI);

using (WebClient client = new WebClient())
{
  try
  {
    client.Proxy = new WebProxy("10.10.10.10", 8080);
    client.Headers.Add("Authorization", "Bearer " + token.AccessToken);
    client.QueryString.Add("serialNumbersDatasource", "I2001258");
    client.QueryString.Add("startDate", string.Format("{0:s}", "2019-12-01"));
    client.QueryString.Add("endDate", string.Format("{0:s}", DateTime.Now));
    client.QueryString.Add("isFilterDatesByDataDate", "false");

    var data = client.DownloadData(uri);
    var data2 = (Encoding.UTF8.GetString(data));

    sensorData = (JsonConvert.DeserializeObject<List<Sensor>>(Encoding.UTF8.GetString(client.DownloadData(uri))))[0];
  }
}

6 个答案:

答案 0 :(得分:3)

这行似乎有问题

client.Headers.Add("Authorization", "Bearer " + "tokenTest");

在这里您将添加标头Authorization和值Bearer tokenTest

因此,您要解决的服务禁止返回403禁止返回,但代理不返回

更改为

client.Headers.Add("Authorization", "Bearer " + tokenTest);

并检查tokenTest是否具有有效值

答案 1 :(得分:0)

检查代理是否需要任何其他属性。您可能需要启用:

UseDefaultCredentials(Boolean)如果默认凭据为true,则为true 用过的;否则为假。默认值为false

另外,检查您正在生成的完整url和查询字符串-查看(在调试器中)或通过Fiddler编造的传出请求,并确保它们全部对齐,包括url,查询字符串,标头,等等

From the docs

地址 获取或设置代理服务器的地址。

BypassArrayList 获取不使用代理服务器的地址列表。

绕过列表
获取或设置不使用代理服务器的地址数组。

BypassProxyOnLocal
获取或设置一个值,该值指示是否绕过本地地址的代理服务器。

凭据 获取或设置要提交给代理服务器进行身份验证的凭据。

UseDefaultCredentials
获取或设置一个布尔值,该值控制DefaultCredentials是否与请求一起发送。

答案 2 :(得分:0)

授权标头可能存在问题。 令牌有效吗?可以在邮递员中使用相同的令牌吗?

我敢打赌api无法验证令牌,并且不授予您任何资源授权。这就是403的意思(但不知道api程序员给您403的意图是什么)。

您可以访问api的源代码吗?

令牌真的是一个字符串“ tokentest”,并且可以与邮递员一起使用吗?

答案 3 :(得分:0)

我建议您使用xNet.dll而不是webclient,因为xNet库被认为最适合代理和webrequest。

var request = new HttpRequest()
request.UserAgent = Http.ChromeUserAgent();
request.Proxy = Socks5ProxyClient.Parse("10.10.10.10:8080");//can use socks4/5 http

答案 4 :(得分:0)

基于this

尝试在标题中添加User-Agent

client.Headers.Add("User-Agent", "PostmanRuntime/7.26.1");

答案 5 :(得分:0)

就我而言,我没有指定安全协议。在运行任何 WebClient 请求之前粘贴这行代码。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

原始答案:How to specify SSL protocol to use for WebClient class

相关问题