Bonjour à vous,

Je m'excuse par avance si je ne me trouve pas au bon endroit..

Je bosse actuellement sur un projet qui consiste à migrer toute une appli faite en WCF vers un projet ASP.NET Core 3.1 (grossièrement je réécris tout).
Je suis en ce moment confronté à l'utilisation des sessions au sein de l'application mais j'étais loin de me douter que ça allait être un sacré calvaire .

En effet, j'essaie tant bien que mal d'implémenter les sessions pour qu'elles puissent être accessibles depuis n'importe où (Controleurs, Bibliothèque de classes...) car
c'est un projet volumineux de type entreprise, l'accessibilité des sessions depuis un endroit autre qu'un controleur est un point essentiel puisque le projet WCF
les utilise un peu partout (les sessions dans ce projet sont gérées par des dictionnaires static etc..)

En partant du principe que c'est possbile et après avoir passé deux jours entiers à tester des choses et faire des recherches, je rame pas mal.

Pour être un peu plus explicite, voici ce que j'ai fait jusqu'à présent :

Premièrement, dans le fichier Statup j'ai configuré ma session de cette manière

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
 
public void ConfigureServices(IServiceCollection services)
{
            services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
            {
                builder.WithOrigins("http://localhost:8180")
                    .AllowAnyMethod()
                    .SetIsOriginAllowed(host => true)
                    .AllowAnyHeader()
                    .AllowCredentials();
            }));
 
            services.AddMemoryCache(); // Me permet d'injecter IMemoryCache depuis n'importe où, fonctionne très bien.
            services.AddSession();
 
            services.AddHttpContextAccessor();
 
            services.AddMvc();
            services.AddControllers().AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            });
 
            services.AddDbContext<AppDbContext>(options => options.UseSqlServer(config.ServeurDev).UseLazyLoadingProxies());
 
            // Mes services injectés
            services.AddScoped<IDicoService, DicoService>();
            // ...
 
            // Mes manager qui dépendent des services du dessus
            services.AddScoped<DicoManager>();
            // ...
 
}
Toujours dans le fichier 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
 
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
 
            app.UseCors("ApiCorsPolicy");
 
            app.UseRouting();
 
            app.UseSession();
 
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
Par la suite, afin que le HttpContext soit accessible de partout (en théorie), j'ai ajouté un service
SessionService :

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
 
    public class SessionManager
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
 
        public SessionManager(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
 
        public string GetString(string key) => _httpContextAccessor.HttpContext.Session.GetString(key);
 
 
        public void SetString(string key, string value) => _httpContextAccessor.HttpContext.Session.SetString(key, value);
    }
Enfin, j'affecte cette classe dans mes services ou autre via le constructeur et l'injecte dans le fichier Startup
via :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
services.AddScoped<SessionManager>();
Malheureusement je ne parviens pas à transmettre les sessions correctement par exemple de Service à Service / de Service à Manager / Manager à Service.
J'ai l'impression que le HttpContext se perd à chaque nouvel appel et qu'une session est re créée à chaque fois, je le constate car l'Id session change
et par conséquent le les sessions sont perdues.
Je pense que quelque chose m'échappe, est-ce peut-être tout simplement pas réalisable ?

Merci par avance,
Mathis.