我工作的公司的互联网连接受到限制,我们使用代理服务器(例如:10.10.10.10:8080)访问某些受限连接。
我可以在Postman中使用API(将代理置于Postman设置中),但是在输入C#WebClient代码时会出现403-Forbidden错误。
我只需要var sensorData
字段,但是我分为var data
和var 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];
}
}
答案 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,查询字符串,标头,等等
地址 获取或设置代理服务器的地址。
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)
答案 5 :(得分:0)
就我而言,我没有指定安全协议。在运行任何 WebClient 请求之前粘贴这行代码。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;