Je me rends compte que session et REST ne vont pas exactement de pair, mais n'est-il pas possible d'accéder à l'état de session à l'aide de la nouvelle API Web? HttpContext.Current.Session
est toujours nul.
asp.net
asp.net-web-api
marque
la source
la source
[SessionState(SessionStateBehavior.Required)]
sur leApiController
fait l'astuce (ou le.ReadOnly
cas échéant).Réponses:
Pour un projet MVC, apportez les modifications suivantes (WebForms et Dot Net Core répondent ci-dessous):
WebApiConfig.cs
Global.asax.cs
Cette solution a le bonus supplémentaire que nous pouvons récupérer l'URL de base en javascript pour effectuer les appels AJAX:
_Layout.cshtml
puis dans nos fichiers / code Javascript, nous pouvons effectuer nos appels webapi qui peuvent accéder à la session:
Faites ce qui précède mais modifiez la fonction WebApiConfig.Register pour prendre un RouteCollection à la place:
Et puis appelez ce qui suit dans Application_Start:
Ajoutez le package NuGet Microsoft.AspNetCore.Session , puis apportez les modifications de code suivantes:
Startup.cs
Appelez les méthodes AddDistributedMemoryCache et AddSession sur l'objet services dans la fonction ConfigureServices:
et dans la fonction Configurer, ajoutez un appel à UseSession :
SessionController.cs
Dans votre contrôleur, ajoutez une instruction using en haut:
puis utilisez l'objet HttpContext.Session dans votre code comme ceci:
vous devriez maintenant pouvoir toucher:
puis accéder à cette URL le retirera:
Beaucoup plus d'informations sur l'accès aux données de session dans dot net core ici: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state
Lisez la réponse de Simon Weaver ci-dessous concernant les performances. Si vous accédez à des données de session dans un projet WebApi, cela peut avoir des conséquences très graves sur les performances - j'ai vu ASP.NET appliquer un délai de 200 ms pour les demandes simultanées. Cela pourrait s'additionner et devenir désastreux si vous avez plusieurs demandes simultanées.
Assurez-vous de verrouiller les ressources par utilisateur - un utilisateur authentifié ne devrait pas être en mesure de récupérer des données de votre WebApi auxquelles il n'a pas accès.
Lisez l'article de Microsoft sur l'authentification et l'autorisation dans l'API Web ASP.NET - https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Lisez l'article de Microsoft sur la façon d'éviter les attaques de piratage Cross-Site Request Forgery. (En bref, consultez la méthode AntiForgery.Validate) - https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks
la source
Vous pouvez accéder à l'état de la session à l'aide d'un RouteHandler personnalisé.
Trouvé ici: http://techhasnoboundary.blogspot.com/2012/03/mvc-4-web-api-access-session.html
la source
Pourquoi éviter d'utiliser Session dans WebAPI?
Performance, performance, performance!
Il y a une très bonne raison, et souvent négligée, pour laquelle vous ne devriez pas du tout utiliser Session dans WebAPI.
La façon dont ASP.NET fonctionne lorsque Session est en cours d'utilisation consiste à sérialiser toutes les demandes reçues d'un seul client . Maintenant, je ne parle pas de sérialisation d'objet - mais de les exécuter dans l'ordre reçu et d'attendre que chacun se termine avant d'exécuter la suivante. C'est pour éviter les conditions de thread / race désagréables si deux requêtes essaient chacune d'accéder à Session simultanément.
Alors qu'est-ce que cela signifie pour l'API Web? Si vous avez une application exécutant de nombreuses requêtes AJAX, seule UNE pourra être exécutée à la fois. Si vous avez une demande plus lente, elle bloquera tous les autres de ce client jusqu'à ce qu'elle soit terminée. Dans certaines applications, cela pourrait conduire à des performances très lentes.
Vous devriez donc probablement utiliser un contrôleur MVC si vous avez absolument besoin de quelque chose de la session des utilisateurs et éviter la pénalité de performance inutile de l'activer pour WebApi.
Vous pouvez facilement tester cela par vous-même
Thread.Sleep(5000)
en insérant simplement une méthode WebAPI et en activant Session. Exécutez-y 5 requêtes et elles prendront un total de 25 secondes. Sans session, cela prendra un peu plus de 5 secondes au total.(Ce même raisonnement s'applique à SignalR).
la source
Eh bien, vous avez raison, REST est apatride. Si vous utilisez une session, le traitement deviendra avec état, les requêtes suivantes pourront utiliser l'état (à partir d'une session).
Pour qu'une session soit réhydratée, vous devrez fournir une clé pour associer l'état. Dans une application asp.net normale, cette clé est fournie à l'aide d'un cookie (cookie-sessions) ou d'un paramètre url (sessions sans cookies).
Si vous avez besoin d'une session, oubliez le repos, les sessions ne sont pas pertinentes dans les conceptions basées sur REST. Si vous avez besoin d'une session pour la validation, utilisez un jeton ou autorisez par des adresses IP.
la source
Mark, si vous vérifiez l' exemple nerddinner MVC, la logique est à peu près la même.
Il vous suffit de récupérer le cookie et de le définir dans la session en cours.
Global.asax.cs
Vous devrez définir votre classe "SampleIdentity", que vous pourrez emprunter au projet nerddinner .
la source
Pour résoudre le problème:
dans Global.asax.cs
la source
Le dernier ne fonctionne pas maintenant, prenez celui-ci, il a fonctionné pour moi.
dans WebApiConfig.cs sur App_Start
Global.asax
fournd ici: http://forums.asp.net/t/1773026.aspx/1
la source
Suite à la réponse de LachlanB, si votre ApiController ne se trouve pas dans un répertoire particulier (comme / api), vous pouvez à la place tester la demande en utilisant RouteTable.Routes.GetRouteData, par exemple:
la source
J'ai eu ce même problème dans asp.net mvc, je l'ai résolu en mettant cette méthode dans mon contrôleur d'api de base dont tous mes contrôleurs d'api héritent:
Ensuite, dans votre appel API, vous souhaitez accéder à la session que vous venez de faire:
J'ai également cela dans mon fichier Global.asax.cs comme d'autres personnes l'ont posté, je ne sais pas si vous en avez toujours besoin en utilisant la méthode ci-dessus, mais ici, c'est juste au cas où:
Vous pouvez également créer un attribut de filtre personnalisé que vous pouvez coller sur vos appels api dont vous avez besoin de session, puis vous pouvez utiliser la session dans votre appel api comme vous le feriez normalement via HttpContext.Current.Session ["SomeValue"]:
J'espère que cela t'aides.
la source
J'ai suivi l'approche @LachlanB et en effet la session était disponible lorsque le cookie de session était présent sur la demande. La partie manquante est de savoir comment le cookie de session est envoyé au client la première fois?
J'ai créé un HttpModule qui non seulement active la disponibilité HttpSessionState mais envoie également le cookie au client lorsqu'une nouvelle session est créée.
la source
une chose doit être mentionnée dans la réponse de @LachlanB.
Si vous omettez la ligne
if (IsWebApiRequest())
Le site entier aura un problème de lenteur de chargement de page si votre site est mélangé avec des pages de formulaire Web.
la source
Oui, la session ne va pas de pair avec l'API Rest et nous devons également éviter ces pratiques. Mais selon les exigences, nous devons maintenir la session d'une manière ou d'une autre de telle sorte que dans chaque demande, le serveur client puisse échanger ou maintenir l'état ou les données. Ainsi, la meilleure façon d'y parvenir sans rompre les protocoles REST est de communiquer via un jeton comme JWT.
https://jwt.io/
la source
Pour en revenir aux bases, pourquoi ne pas rester simple et stocker la valeur de la session dans une valeur html cachée pour la transmettre à votre API?
Manette
cshtml
Javascript
$ (document) .ready (fonction () {
}
la source