È ansible accedere a HttpContext.Current.Session dall’API Web

È ansible accedere a HttpContext.Current.Session tramite WebAPI? possiamo farlo ereditare IRequiresSession?

Ho un gestore generico che esegue un set di sessioni dopo una chiamata API che voglio rimuovere.

public void AccountController : ApiController, IRequiresSessionState { public void Login() { setsession(){} } } 

Tecnicamente , sì, anche se mi piacerebbe davvero sconsigliare questa pratica – un’API REST dovrebbe essere completamente stateless (i cookie e gli altri stati lato client sono OK).

Se devi assolutamente farlo, puoi afferrare il contesto HTTP in questo modo:

 var context = Request.Properties["MS_HttpContext"] as HttpContext; 

A quel punto basta usare la sua proprietà Session per ottenere la sessione.

Nota che ciò interrompe determinati contratti assunti da System.Net.Http – in particolare significa che i tuoi controller API non possono mai essere auto-ospitati perché sono accoppiati ad ASP.NET. Se stai bene con questo, e con il fatto che i tuoi controller API potrebbero non funzionare correttamente da una web farm a meno che non si riesegua l’architetto di tutto per usare le sessioni distribuite – beh allora, vai a farlo.

PS È anche ansible utilizzare IRequiresSessionState , ma non è ansible utilizzarlo sul controller stesso, è necessario utilizzarlo su HttpControllerHandler e impostarlo come RouteHandler . L’approccio è discusso in questo thread MSDN . Ancora una volta, non posso raccomandare abbastanza contro questa idea, viola il principio di base di un’API Web, ma, se hai una buona ragione, è un’altra opzione che è un po ‘più riutilizzabile.

Lanciarlo come HttpContext non ha funzionato per me usando Web Api 2.1. Tuttavia potrei usare HttpContextWrapper.

 var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;