2 votes

HttpWebRequest n'est pas reçu correctement dans MVC ASP.NET

C'est moi qui documente publiquement mon erreur pour que si je refais la même, ou si quelqu'un d'autre la refait, il ne perde pas 3 heures à se tirer les cheveux pour résoudre un problème aussi simple.

Contexte

Je faisais une requête HTTP d'une application C# MVC ASP.NET vers une autre. Les applications nécessitent une connexion HTTPS, et nous utilisons URLRewrite pour rediriger une requête HTTP vers une URL HTTPS.

Une application envoyait une requête POST avec des données JSON dans le corps, assez classique. L'autre application était configurée pour recevoir ces données avec une classe de contrôleur MVC (méthodes CollectionAction et Insert pour GET et POST respectivement).

Symptômes du problème

L'application receveuse exécutait la méthode GET (CollectionAction) au lieu de l'action POST (ItemAction). La raison de cela était que la requête entrante dans l'application était en fait une requête GET, et en plus les données JSON manquaient.

J'ai envoyé l'en-tête "x-http-method" pour remplacer la méthode de requête de GET à POST (j'avais déjà défini la méthode de requête en POST mais cela était ignoré). Cela a fonctionné mais je n'avais toujours pas de données envoyées.

Donc maintenant je suis bloqué à me tirer les cheveux, car je vois une requête POST avec une longueur de contenu et des données envoyées et j'ai une requête GET sans données ni longueur de contenu entrantes (mais les en-têtes étaient préservés).

0voto

Eddie Loeffen Points 341

Il s'avère que j'utilisais UriBuilder pour prendre une URL de base et lui appliquer un chemin de ressource. Par exemple, j'avais "google.com" dans mon fichier web.config et puis UriBuilder prendrait une ressource comme Pages et construirait l'URL "google.com/Pages". Malheureusement, je n'initialisais pas UriBuilder avec l'URL de base et au lieu de cela, j'utilisais un deuxième UriBuilder pour extraire l'hôte et l'ajouter au chemin comme ceci :

public Uri GetResourceUri(string nomRessource)
    {
        var domaine = new UriBuilder(GetBaseUrl());
        var uribuilder = new UriBuilder()
        {
            Path = domaine.Path.TrimEnd('/') + "/" + nomRessource.TrimStart('/'),
            Host = domaine.Host
        };
        var ressourceUri = uribuilder.Uri;
        return ressourceUri;
    }

Le problème avec ce code est que le schéma est ignoré (HTTP:// vs HTTPS://) et qu'il est par défaut en HTTP. Ainsi, mon client envoyait la requête à une URL en HTTP au lieu de l'URL HTTPS requise. C'est là que cela devient intéressant, URLRewrite intervenait et disait que nous devions aller vers une URL HTTPS, donc il nous redirigeait là-bas. Mais en le faisant, il ignorait la méthode HTTP et les données POST, qui étaient simplement définies par défaut en GET et null. C'est ce que la seconde application pouvait voir à la réception.

Ainsi, la fonction a dû être réécrite comme ceci pour résoudre le problème :

public Uri GetResourceUri(string nomRessource)
    {
        var baseUrl = GetBaseUrl();
        var domaine = new UriBuilder(baseUrl);
        var uribuilder = new UriBuilder(baseUrl)
        {
            Path = domaine.Path.TrimEnd('/') + "/" + nomRessource.TrimStart('/'),
        };
        var ressourceUri = uribuilder.Uri;
        return ressourceUri;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X