session - tutorial - route web api 2 c#
¿Sesión de ASP.NET Web API o algo así? (5)
Ahora en 2017 con ASP.Net Core puede hacerlo como se explica aquí.
El paquete Microsoft.AspNetCore.Session proporciona middleware para administrar el estado de la sesión.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession();
}
De los documentos: Introducción a la sesión y estado de la aplicación en ASP.NET Core
Ya probado en un proyecto de trabajo
Necesito almacenar cierta información en sesión (o en lo que sea en ASP.NET Web API) que necesito recuperar en cada solicitud de API. Tendremos un sitio web api IIS y se agregará un enlace a varios sitios web a través del encabezado del host. Cuando se recibe una solicitud, por ejemplo, api.xyz.com, se verificará el encabezado del host y se almacenará la información del sitio web en sesión que se usará en cada solicitud posterior de API al realizar una llamada a la base de datos.
Sé que no hay soporte para la sesión en ASP.NET Web API. ¿Hay alguna otra manera de manejar este tipo de situación? ¿Dónde puedo almacenar información que se puede recuperar en cada solicitud posterior?
Gracias.
Bueno, REST por diseño no tiene estado. Al agregar una sesión (o cualquier otra cosa de ese tipo) lo está haciendo claro y frustrando cualquier propósito de tener una API RESTful.
La idea del servicio RESTful es que cada recurso sea direccionable usando una sintaxis universal para usar en hipermedia enlaces y cada solicitud HTTP debe llevar suficiente información por sí misma para que su destinatario la procese en completa armonía con la naturaleza sin estado de HTTP ". .
Entonces, sea lo que sea lo que intente hacer con la API web aquí, lo más probable es que sea una arquitectura nueva si desea tener una API RESTful.
Dicho esto, si todavía estás dispuesto a seguir esa ruta, existe una forma estrafalaria de agregar sesiones a la API web, y ha sido publicada por Imran aquí http://forums.asp.net/t/1780385.aspx/1
Código (aunque realmente no lo recomendaría):
public class MyHttpControllerHandler
: HttpControllerHandler, IRequiresSessionState
{
public MyHttpControllerHandler(RouteData routeData): base(routeData)
{ }
}
public class MyHttpControllerRouteHandler : HttpControllerRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpControllerHandler(requestContext.RouteData);
}
}
public class ValuesController : ApiController
{
public string GET(string input)
{
var session = HttpContext.Current.Session;
if (session != null)
{
if (session["Time"] == null)
{
session["Time"] = DateTime.Now;
}
return "Session Time: " + session["Time"] + input;
}
return "Session is not availabe" + input;
}
}
y luego agregue HttpControllerHandler a su ruta API:
route.RouteHandler = new MyHttpControllerRouteHandler();
En WebApi 2 puede agregar esto a global.asax
protected void Application_PostAuthorizeRequest()
{
System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
Luego, puedes acceder a la sesión a través de:
HttpContext.Current.Session
Puede utilizar cookies si los datos son lo suficientemente pequeños y no representan un problema de seguridad. El mismo enfoque basado en HttpContext.Current debería funcionar.
Los encabezados HTTP de solicitud y respuesta también se pueden usar para pasar información entre llamadas de servicio.
en Global.asax agregar
public override void Init()
{
this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
base.Init();
}
void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
System.Web.HttpContext.Current.SetSessionStateBehavior(
SessionStateBehavior.Required);
}
Dale un tiro ;)