La société pour laquelle je travaille a une connexion Internet limitée et nous utilisons le proxy (exemple: 10.10.10.10:8080) pour accéder à certaines connexions restreintes.
Je peux utiliser l'API dans Postman (en mettant le proxy dans le Paramètres du facteur) mais lors de la mise dans le code C # WebClient, cela me donne une erreur 403-Forbidden.
Je n'ai besoin que du champ var sensorData mais j'ai divisé en var data et var data2 pour comprendre où était le problème. Cela me donne l'erreur au niveau de 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];
}
}
5 Réponses :
Vérifiez si vous avez besoin de propriétés supplémentaires sur le proxy. Vous devrez peut-être activer:
UseDefaultCredentials (Boolean) true si les informations d'identification par défaut sont utilisé; sinon, faux. La valeur par défaut est false
Vérifiez également votre URL complète et la chaîne de requête que vous produisez - regardez la requête sortante fabriquée (dans le débogueur) ou via Fiddler et assurez-vous que tout est bien aligné, URL, chaîne de requête, en-têtes, etc.
À partir de la documentation a>:
Adresse Obtient ou définit l'adresse du serveur proxy.
BypassArrayList Obtient une liste d'adresses qui n'utilisent pas le serveur proxy.
BypassList
Obtient ou définit un tableau d'adresses qui n'utilisent pas le serveur proxy.
BypassProxyOnLocal
Obtient ou définit une valeur qui indique s'il faut contourner le serveur proxy pour les adresses locales.
Identifiants Obtient ou définit les informations d'identification à soumettre au serveur proxy pour l'authentification.
UseDefaultCredentials
Obtient ou définit une valeur booléenne qui contrôle si les DefaultCredentials sont envoyés avec les requêtes.
UseDefaultCredentials à true ou false donne la même sortie, erreur 403. Je vais essayer avec Fiddler
@ ToméCerqueira, regardez également ici stackoverflow.com/questions/817548/…
Semble le problème à cette ligne
client.Headers.Add("Authorization", "Bearer " + tokenTest);
Ici, vous allez ajouter l'en-tête Authorization avec la valeur Bearer tokenTest
donc, 403 Forbidden renvoie par le service auquel vous vous adressez, mais pas par un proxy
changer en
client.Headers.Add("Authorization", "Bearer " + "tokenTest");
et vérifier si tokenTest code> a une valeur valide
C'est ce que j'avais, j'ai changé pour mieux comprendre que je passais une corde. J'ai modifié le code pour qu'il ressemble à ce que j'ai
Probablement un problème avec l'en-tête d'autorisation. Le jeton est-il valide? Fonctionne-t-il avec le même jeton dans Postman?
Je parie que l'API ne peut pas valider le jeton et ne vous donne aucune autorisation sur les ressources. C'est ce que signifierait un 403 (mais je ne sais pas ce que le programmeur d'API voulait réellement en vous donnant 403).
Avez-vous accès au code source de l'API?
Le token est vraiment une chaîne "tokentest" et qui fonctionne avec Postman?
Non, le "tokentest" n'était qu'un exemple. J'ai déjà modifié pour être similaire à ce que j'ai
L'avez-vous essayé sans proxy pour savoir si le problème vient de l'API ou du serveur proxy?
J'ai essayé maintenant et il semble que cela ne fonctionne pas aussi sans le proxy. C'est bizarre parce que ça marche dans Postman
essayez-le avec la classe httpclient
Je vous suggère d'opter pour xNet.dll au lieu de webclient car la bibliothèque xNet est considérée comme la meilleure pour proxy et webrequest.
var request = new HttpRequest()
request.UserAgent = Http.ChromeUserAgent();
request.Proxy = Socks5ProxyClient.Parse("10.10.10.10:8080");//can use socks4/5 http
D'après ceci
Essayez d'ajouter User-Agent dans l'en-tête p>
client.Headers.Add("User-Agent", "PostmanRuntime/7.26.1");