Vâng, REST theo thiết kế là không trạng thái. Bằng cách thêm phiên (hoặc bất kỳ thứ gì khác thuộc loại đó), bạn đang làm cho nó có trạng thái và đánh bại bất kỳ mục đích nào của việc có một API RESTful.
Toàn bộ ý tưởng của dịch vụ RESTful là mọi nguồn lực là địa chỉ duy nhất sử dụng một cú pháp phổ biến để sử dụng trong hypermedia các liên kết và mỗi yêu cầu HTTP nên mang theo đầy đủ thông tin của bản thân cho người nhận nó để xử lý nó được trong sự hòa hợp hoàn chỉnh với bản chất phi trạng thái của HTTP".
Vì vậy, bất cứ điều gì bạn đang cố gắng để làm với Web API ở đây, nên rất có thể được tái architectured nếu bạn muốn có một API RESTful.
với những gì đã nói, nếu bạn vẫn sẵn sàng để đi xuống con đường đó, có một cách hacky của việc thêm bị nén đến Web API, và nó được đăng bởi Imran đây http://forums.asp.net/t/1780385.aspx/1
Mã (mặc dù tôi sẽ không thực sự khuyên):
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;
}
}
và sau đó thêm HttpControllerHandler để định tuyến API của bạn:
route.RouteHandler = new MyHttpControllerRouteHandler();
Nguồn
2012-07-13 22:09:55
Cảm ơn. rất hữu ích. Tôi sẽ không chống lại REST nhưng tôi muốn lưu chuyến đi cơ sở dữ liệu cho mỗi yêu cầu api. Chúng tôi có id duy nhất liên quan đến tên miền api mà thực hiện một yêu cầu mà tôi cần phải đi qua để gọi cơ sở dữ liệu cho mỗi yêu cầu api. Nếu tôi không sử dụng phiên, tôi sẽ lặp lại cùng một logic cho mỗi yêu cầu api. BTW là có một cách tôi có thể ghi đè tương tự như PreRequestHandlerExecute chúng tôi có trong asp.net và lưu trữ dữ liệu trong phiên mà tôi muốn lấy trong mỗi yêu cầu api? – user1186065
Bộ điều khiển sẽ khó kiểm tra đơn vị theo cách này. Tôi sẽ thêm một đối số HttpContextBase (hoặc HttpSessionStateBase) trong bộ tạo điều khiển và sử dụng DI để giải quyết nó thành HttpContextWrapper (HttpContext.Current) mới cho ứng dụng. Sau đó, trong các bài kiểm tra đơn vị bạn có thể thử nó. –
Như @Filip đã nói, chúng ta không đi theo con đường này (thêm phiên vào Web API được cho là không quốc tịch). Nhưng cùng Filip có một bài viết hay về Caching Web API: http://goo.gl/2rnfI Tôi chia anh ta thành gitHub và thêm một vài chức năng vào mã nguồn, bây giờ nó hỗ trợ cache đầu ra riêng biệt cho người dùng đã đăng nhập : http://goo.gl/oW4hX LƯU Ý: Tôi vẫn đang cải thiện mã và kiểm tra mã cho bất kỳ vi phạm bảo mật có thể xảy ra nào. – Tohid