2
votes

C # MVC détecte si XMLHttpRequest

J'ai essayé ce qui suit dans mon contrôleur C #

a utilisé les espaces de noms suivants

function reqListener () {
    console.log(this.responseText);
}

var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://localhost:5001/Movies/Create");
oReq.send();

et les "choses" suivantes dans IActionResult Create () méthode

    // GET: Movies/Create
    public IActionResult Create()
    {
        Request.IsAjaxRequest(); // this line tells me "HttpRequest does not contain a defintion for IsAjaxRequest .. (are you missing a using directive?)"


        string method = HttpContext.Request.Method;
        string requestedWith = HttpContext.Request.Headers["X-Requested-With"];

        HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

        new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest()


        return View();
    }

Aucune d'elles ne fonctionne pour moi. Je peux déboguer la requête mais je ne trouve rien qui m'indique qu'il s'agit d'un xhr ou XMLHttpRequest.

J'appelle l'action du contrôleur comme ceci :

 using System;
 using System.Web;
 using System.Web.Mvc;

Les outils de développement du navigateur me disent qu'il s'agit d'une requête de type XHR: entrez la description de l'image ici

Comment puis-je détecter la requête XHR dans un contrôleur C # ou dans un fichier .cshtml ?

c#

10 commentaires

Je commencerais par regarder dans les outils de développement de votre navigateur les demandes sortantes pour valider la bibliothèque ajax que vous utilisez envoie bien l'en-tête X-Requested-With


De plus, la documentation de XMLHttpRequest est un bon début. developer.mozilla.org/en-US/docs/Web/ API / XMLHttpRequest /…


@Daniel Type dit "xhr" imgur.com/a/m8OUFq7


@RomanMik c'est exactement de là que je tire l'extrait. Le problème n'est pas le navigateur! Je me demande comment je peux réagir dessus côté serveur


Quelle est l'erreur avec new HttpRequestWrapper (System.Web.HttpContext.Current.Request) .I‌ sAjaxRequest () ?


@caramba développez la requête et voyez ce qui est envoyé par le navigateur à votre serveur, vous verrez la liste des en-têtes (le cas échéant)


@RomanMik c'est une liste énorme voir ici: imgur.com/a/wRWFuiQ n'a pas trouvé de correspondance xmlHttpRequest


@TheOne ça me dit que HttpRequestWrapper n'existe pas dans l'espace de noms actuel


veuillez suivre le lien ci-dessous stackoverflow.com/questions/29282190/...


@MuhammadAli merci pour le lien mais je ne vois pas comment je peux ajouter cette fonctionnalité. D'autres indices?


3 Réponses :


0
votes

Vous n'avez pas importé l'extension AjaxRequestExtensions. C'est pourquoi vous obtenez une erreur sur la première ligne

Request.IsAjaxRequest (); // cette ligne me dit "HttpRequest ne contiennent une définition pour IsAjaxRequest .. (vous manquez directive?) "


5 commentaires

comment puis-je importer les AjaxRequestExtensions ?


Désolé, vous n'avez pas besoin de l'importer, il devrait déjà être dans System.Web.Mvc. Quelle version de MVC utilisez-vous. Je viens de tester avec MVC 5 et c'est là.


Tout ce que je peux trouver dit "framework": {"name": "Microsoft.AspNetCore.App", "version": "2.2.0"} J'ai suivi cet exemple , il devrait donc être un peu nouveau mais ne peut trouver aucune version liée à MVC


Pour l’application ASP.NET Core, consultez cet article stackoverflow.com/questions/29282190/...


Merci d'avoir essayé de vous aider, le même lien a déjà été mentionné il y a 10h quelques lignes plus haut sur cette question voir le commentaire ici



2
votes

Vous pouvez faire ce qui suit:

    // GET: Movies/Create
    public IActionResult Create()
    {
        string requestedWith = HttpContext.Current.Request.Headers["X-Requested-With"];

        if(requestedWith == "XMLHttpRequest")
        {
           // Do whatever you want when an AJAX request comes in here....
        }

        return View();
    }

Sachez qu'en réalité, il n'existe aucun moyen infaillible de détecter les requêtes AJAX - le code X-Requested-With > l'en-tête est éventuellement envoyé par le développeur ou une bibliothèque cliente, telle que jQuery. Il n'y a donc aucune garantie que cet en-tête sera envoyé, sauf si bien sûr, vous êtes le développeur du seul code côté client qui utilisera ce service. Pour le serveur, rien ne différencie une requête AJAX de tout autre type de requête.


4 commentaires

Salut, merci pour cette réponse. Je n'ai pas eu le temps d'y revenir plus tôt. Si j'essaye ceci, j'obtiens: "HttpContext" ne contient pas de définition pour "Current"


@caramba Assurez-vous que vous utilisez System.Web et utilisez System.Web.HttpContext.Current.Request.Headers ["X-Requested-‌ With"]


pourquoi "X-Requested-With" et non XMLHttpRequest comme dans ma réponse?


@caramba Vraiment, vous pouvez nommer l'en-tête comme vous le souhaitez, X-Requested-With est simplement le nom standard d'un en-tête décrivant le client qui a fait la demande. Si vous aimez XMLHttpRequest , allez-y. La partie importante de mon commentaire est de vous assurer que vous ajoutez HttpContext avec System.Web comme indiqué.



1
votes

Comme Byron Jones l'a souligné dans la réponse I nécessaire pour définir le MLHttpRequest.setRequestHeader () moi-même et si vous suivez le lien, vous verrez que c'est aussi simple que d'ajouter

// C# needs the line:
public IActionResult Create()
    {
        ViewData["xmlHttpRequest"] = false;
        if (HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") {
            ViewData["xmlHttpRequest"] = true;
        }

        return View();
    }


// and javascript like so:
function reqListener () {
  console.log(this.responseText);
}

var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://localhost:5001/Movies/Create");
oReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); // this is the only new line
oReq.send();

donc mis à jour mon code à partir de la question comme ceci:

oReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
D'après la documentation

, c'est indiqué p >

La méthode XMLHttpRequest setRequestHeader () définit la valeur d'un HTTP en-tête de la demande. Lorsque vous utilisez setRequestHeader (), vous devez l'appeler après appeler open (), mais avant d'appeler send () . Si cette méthode est appelée plusieurs fois avec le même en-tête, les valeurs sont fusionnées en une seule en-tête de requête unique.

Suivez les liens pour plus d'informations.


0 commentaires