IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

ASP.NET Core 2.1 - Proxy (PAC) - BadRequest


Sujet :

ASP.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut ASP.NET Core 2.1 - Proxy (PAC) - BadRequest
    Bonjour,

    Je viens de m'inscrire sur le forum et ceci est mon premier poste. Je ne parviens pas à trouver de réponse à ma problématique malgré de nombreuses recherches.

    Je suis derrière un proxy configuré dans un fichier PAC. Je cherche à appeler une api mais j'obtiens toujours un BadRequest. Je ne parviens pas à comprendre d'où vient le problème. Mon application est hébergée sur ISS mais j'obtiens le même résultat en local (avec IIS express).

    J'ai fait une nouvelle application de test où je n'ai modifié que la procédure Configure du Startup.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
     
                AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
     
                app.Run(async (context) =>
                {
                    NetworkCredential creds = new NetworkCredential
                    {
                        Domain = "Domain",
                        UserName = "User",
                        Password = "Pwd"
                    };
     
                    WebProxy proxy = new WebProxy
                    {
                        Address = new Uri("http://foo.bar/proxy.pac"),
                        Credentials = creds
                    };
     
                    HttpClientHandler handler = new HttpClientHandler
                    {
                        UseProxy = true,
                        Proxy = proxy
                    };
     
                    HttpClient client = new HttpClient(handler, true);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "apiPwd");
     
                    string destAPIUrl = "https://api.blabla.com/function?param1=30&param2=10&param3=43";
     
                    HttpResponseMessage response = client.GetAsync(destAPIUrl).Result;
     
                    if (response.IsSuccessStatusCode)
                        await context.Response.WriteAsync(await response.Content.ReadAsStringAsync());
                    else
                        await context.Response.WriteAsync(response.StatusCode.ToString() + " : " + response.ReasonPhrase);
                });
            }
    Il n'y a aucune interface utilisateur. Le but est de renvoyer le résultat Json vers une autre application qui affichera les données. C'est une sorte de "passe-plat" : l'application demandeuse est installée sur un serveur qui n'a pas accès à internet.

    En vous remerciant de l'aide apporté,
    Lykazia

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 47
    Points
    47
    Par défaut
    si tu veux appeler une web Api et avec se que tu explique :
    tu fait un projet Console
    et là dans le Main tu utilise HttpClient (comme tu l'a fait)

    pour l'authentification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    var requestUriWithQuery = string.Concat(requestUri, "?", paramsQuery);
    var response = await httpClient.GetAsync(requestUriWithQuery)
    après ta réponse tu doit la déserialisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HttpResponseMessage response
    var result = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<TContentResponse>(result);
    après c'est quoi le message d'erreur exactement?

    j'espère que ça t'aidera, n'hésite pas a poser des question ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Je fais exactement se que tu décris.
    Pour mon AuthenticationHeaderValue, je suis bien en "Basic" avec le user:pwd en Base64
    La partie déserialisation est dans une autre appli qui reçois le résultat de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    await context.Response.WriteAsync(await response.Content.ReadAsStringAsync());
    Mon problème c'est que la ligne ci-dessous renvoi toujours une erreur "BadRequest".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpResponseMessage response = client.GetAsync(destAPIUrl).Result;
    Nom : BadRequest.jpg
Affichages : 205
Taille : 38,0 Ko

    J'ai testé d'exécuter mon code depuis chez moi (donc sans proxy) et ça fonctionne sans problème. Par contre, quand je test depuis mon entreprise (donc avec proxy) j'ai toujours ce "BadRequest".
    J'en conclu que je n'ai pas de problème de construction de l'URL de l'API web mais bien un problème d'intégration du WebProxy dans le HttpClientHandler lui même ajouté au HttpClient.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 47
    Points
    47
    Par défaut
    salut,

    en général l'erreur 400 BadRequest est du à une mauvaise interprétation, du serveur cible, de ta requête. donc elle est bien arrivé à destination (a première vue)

    en général avant d'avoir cette erreur j'ai une erreur 401 Unauthorized si on est mal authentifié (ça m'arrive souvent avec des Token périmé ou vide).
    tu peux tester ça pour savoir si t'arrive vraiment à joindre le serveur cible.

    j'ai pas d'autre idée pour le moment.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai fais le test que tu m'indiques en mettant volontairement un mauvais login/password puis en retirant complètement l'authentification mais j'ai toujours la même erreur. Je pense que je n’atteins pas le serveur cible.

    Par contre, j'ai pu faire un test depuis mon entreprise sans utiliser le proxy (donc directement le HttpClient sans WebProxy ni handler) et là, ça a marché. Evidemment cette solution n'est pas acceptable : il faut absolument que je passe par le proxy.

    En te remerciant pour ton implication,
    Lykazia

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/09/2016, 01h52
  2. Test unitaire ASP NET Core 1
    Par amalliap dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/08/2016, 00h57
  3. Recherche hébergement ASP.NET Core 1.0
    Par jatloui dans le forum Hébergement
    Réponses: 0
    Dernier message: 04/08/2016, 09h37
  4. Microsoft annonce la disponibilité de la RC2 de .NET Core et ASP.NET Core
    Par Stéphane le calme dans le forum Framework .NET
    Réponses: 2
    Dernier message: 20/05/2016, 14h31
  5. Réponses: 1
    Dernier message: 10/05/2016, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo