.NET Web API + Session-Timeout
Erstelle ich ein web-service mit dem web-api-controller. Ich möchte in der Lage sein, um eine Sitzung zu erstellen, und überprüfen Sie den status der Sitzung. Ich habe Folgendes:
Controller:
public string Get(string user, string pass)
{
bool loginValue = false;
loginValue = UserNamepassword(user, pass);
if (loginValue == true)
{
HttpContext.Current.Session.Add("Username", user);
//session["Username"] = user;
//session.Add("Username", user);
if ((string)HttpContext.Current.Session["Username"] != null)
{
HttpContext.Current.Session.Add("Time", DateTime.Now);
return "Username: " + (string)HttpContext.Current.Session["Time"] + (string)HttpContext.Current.Session["Username"];
}
return "Logged in but session is not availabe for " + (string)HttpContext.Current.Session["Username"];
}
else
return "Login failed for " + user;
}
WebConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapHttpRoute(
name: "SessionApi",
routeTemplate: "api/{controller}/{user}/{pass}",
defaults: new { user = RouteParameter.Optional, pass = RouteParameter.Optional }
);
route.RouteHandler = new MyHttpControllerRouteHandler();
}
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);
}
}
Global.asax.cs
WebApiConfig.RegisterRoutes(RouteTable.Routes);
Wenn ich diesen code ausführen ich erhalte immer null-Verweis in der Sitzung.
HttpContext.Current.Session.Add("Username", user);
//session["Username"] = user;
//session.Add("Username", user);
Wer weiß, warum ich nicht festlegen, dass die session-variable zu nichts. Es spielt keine Rolle, welche Methode ich verwenden, die nicht von den drei arbeiten. Der code wurde von einem anderen Beitrag.
- Verwenden Sie keine Sitzung in der web-Api. Dass Niederlagen der Zweck.
- Ich zu haben. Ich weiß nicht, andere Weise. Ich bin neu in Web-API. noch recherche auf es. aber für die Zeit, beng, die ich brauche, es zu benutzen
- mögliche Duplikate von ASP.NET Web-API-Sitzung oder so etwas?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist by-design in Web-API, weil es ist entworfen, für das erstellen von restful-web-services. Wirklich erholsam ist ein Dienst sollte nicht irgendeine Art von Zustand, d.h.
/myserver/somendpoint/5
sollte das gleiche Ergebnis für jede Anforderung mit einem bestimmten verb.Aber wenn das nicht zusagen, können Sie diese aktivieren-session in der web-API durch das hinzufügen von folgenden globalen.asax.
HttpContext.Current.Session["Whatever"]
und ähnliches.Dies ist, wo die Semantik oft die Wolken der Diskussion. Leute verwechseln das Session-Objekt mit der Staatenlosigkeit. Und oft sagen: "don 'T verwenden session, da ist es nicht staatenlos!'.
Jedoch meinen Sie tatsächlich, dass Sie sollten sich bemühen, Ihre Rest-Aufrufe werden idempotent, was bedeutet, Sie nicht Ihr Verhalten ändern, je nachdem auf was auch immer es ist, Sie tun in den hintergrund.
Sitzung, oder die runtime-cache, oder was es auch immer ist, die Sie verwenden, um Daten zu Cachen, hat keine Auswirkungen auf den stateless-design, weil wirklich, was kommt als Nächstes? Ihre Datenbank ist zustandsbehaftete auch? Und man sollte nicht die gelesenen Daten ab? Unsinn natürlich; Ihre zugrunde liegenden Speicher, wenn es im Arbeitsspeicher oder auf der Festplatte hat keine Reflexion auf Ihren Status an den client.
Also nutzen, mit allen Mitteln, die session-Objekt als Ben Robinson hingewiesen. Aber lasst nie die Tatsache, wenn etwas ist IN der Sitzung ein anderes Ergebnis zurückgeben dann, wenn etwas AUS der Sitzung.
Bitte nicht!
Web API
sollstateless
,RESTful
usw. Durch die VerwendungState
Sie zu besiegen, Ihr ganzer Zweck.