簡體   English   中英

403 禁止使用 WebClient

[英]403 Forbidden with WebClient

我工作的公司的互聯網連接有限,我們使用代理(例如:10.10.10.10:8080)在某些受限連接上進行訪問。

我可以在 Postman 中使用 API(將代理放在 Postman 設置中),但是當放入 C# WebClient 代碼時,它給了我一個 403-Forbidden 錯誤。

我只需要var sensorData字段,但我var sensorDatavar 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];
  }
}

似乎這一行的問題

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

在這里,您將添加值為Bearer tokenTest標頭Authorization

因此,403 Forbidden 通過您正在尋址的服務而不是代理返回

改成

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

並檢查tokenTest是否具有有效值

檢查您是否需要代理上的任何其他屬性。 您可能需要啟用:

UseDefaultCredentials (Boolean) 如果使用默認憑據,則為 true; 否則為假。 默認值為 false

此外,檢查您正在生成的完整 url 和查詢字符串 - 查看制作的傳出請求(在調試器中)或通過Fiddler並確保它們全部對齊,url、查詢字符串、標題等。

從文檔

Address獲取或設置代理服務器的地址。

BypassArrayList獲取不使用代理服務器的地址列表。

繞過列表
獲取或設置不使用代理服務器的地址數組。

BypassProxyOnLocal
獲取或設置一個值,該值指示是否為本地地址繞過代理服務器。

Credentials獲取或設置提交給代理服務器進行身份驗證的憑據。

使用默認憑據
獲取或設置一個布爾值,該值控制是否隨請求發送 DefaultCredential。

可能是授權標頭的問題。 令牌有效嗎? 它在 Postman 中使用相同的令牌嗎?

我敢打賭 api 無法驗證令牌,並且不授予您對資源的授權。 這就是 403 的意思(但不知道 api 程序員給你 403 的實際意圖是什么)。

您可以訪問 api 的源代碼嗎?

令牌實際上是一個字符串“tokentest”並且可以與 Postman 一起使用?

我建議你使用 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

基於

嘗試在標頭中添加User-Agent

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

就我而言,我沒有指定安全協議。 在運行任何 WebClient 請求之前粘貼這行代碼。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

原始答案: 如何指定用於 WebClient 類的 SSL 協議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM