MVC
Pour un projet MVC, effectuez les changements suivants (WebForms et Dot Net Core répondent plus bas) :
WebApiConfig.cs
public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
...
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}
Cette solution présente l'avantage supplémentaire de pouvoir récupérer l'URL de base en javascript pour effectuer les appels AJAX :
_Layout.cshtml
<body>
@RenderBody()
<script type="text/javascript">
var apiBaseUrl = '@Url.Content(ProjectNameSpace.WebApiConfig.UrlPrefixRelative)';
</script>
@RenderSection("scripts", required: false)
et ensuite dans nos fichiers/codes Javascript nous pouvons faire nos appels webapi qui peuvent accéder à la session :
$.getJSON(apiBaseUrl + '/MyApi')
.done(function (data) {
alert('session data received: ' + data.whatever);
})
);
WebForms
Faites ce qui précède mais modifiez la fonction WebApiConfig.Register pour qu'elle prenne une RouteCollection à la place :
public static void Register(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Et ensuite, appelez ce qui suit dans Application_Start :
WebApiConfig.Register(RouteTable.Routes);
Dot Net Core
Ajouter le Microsoft.AspNetCore.Session NuGet, puis apportez les modifications suivantes au code :
Startup.cs
Appelez le AddDistributedMemoryCache et AddSession sur l'objet services dans la fonction ConfigureServices :
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
...
services.AddDistributedMemoryCache();
services.AddSession();
et dans la fonction Configure, ajoutez un appel à UseSession :
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseSession();
app.UseMvc();
SessionController.cs
Dans votre contrôleur, ajoutez une déclaration d'utilisation en haut :
using Microsoft.AspNetCore.Http;
et ensuite utiliser l'objet HttpContext.Session dans votre code comme suit :
[HttpGet("set/{data}")]
public IActionResult setsession(string data)
{
HttpContext.Session.SetString("keyname", data);
return Ok("session data set");
}
[HttpGet("get")]
public IActionResult getsessiondata()
{
var sessionData = HttpContext.Session.GetString("keyname");
return Ok(sessionData);
}
vous devriez maintenant être en mesure de frapper :
http://localhost:1234/api/session/set/thisissomedata
et ensuite aller à cette URL le fera sortir :
http://localhost:1234/api/session/get
Pour en savoir plus sur l'accès aux données de session dans Dot Net Core, cliquez ici : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state
Problèmes de performance
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 imposer un délai de 200 ms pour les requêtes simultanées. Cela peut s'accumuler et devenir désastreux si vous avez beaucoup de demandes simultanées.
Problèmes de sécurité
Assurez-vous que vous verrouillez les ressources par utilisateur - un utilisateur authentifié ne doit 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 ASP.NET Web API -. 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 type Cross-Site Request Forgery. (En bref, vérifiez la méthode AntiForgery.Validate) - https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks
5 votes
[SessionState(SessionStateBehavior.Required)]
sur leApiController
fait l'affaire (ou.ReadOnly
le cas échéant).0 votes
@RomanStarkov Je n'ai pas réussi à le faire fonctionner. Quel environnement utilisiez-vous ? .NET Core ?
1 votes
@Bondolin non, ce n'était pas Core.
0 votes
@RomanStarkov MVC alors ? J'ai du mal à le trouver.
0 votes
@Bondolin Attribut de l'état de la session et oui, MVC.
0 votes
Pourquoi ne pas utiliser un cache distribué ? Par exemple, Redis est très bon pour cela.