c#在WebAPI使用Session的方法
程序员文章站
2023-12-18 09:05:46
最近在改写webapp时要将以前用泛型处理例程写的captcha 改成使用webapi 来实作机制,在实作的过程中发现使用irequiressessionstate ses...
最近在改写webapp时要将以前用泛型处理例程写的captcha 改成使用webapi 来实作机制,在实作的过程中发现使用irequiressessionstate session也无法使用(context.session==null)
查过一些文章才发现需要在注册api路由需将routehandler 改写,才能使用。以下用asp.net mvc 4来说明要实作的部分
建立httpcontrollerhandler和httpcontrollerroutehandler 并覆写它
public class sessionroutehandler : httpcontrollerhandler, irequiressessionstate { public sessionroutehandler(routedata routedata) : base(routedata) { } } public class sessioncontrollerroutehandler : httpcontrollerroutehandler { protected override ihttphandler gethttphandler(requestcontext requestcontext) { return new sessionroutehandler(requestcontext.routedata); } }
在webapiconfig中将config.routes.maphttproute 改成
routetable.routes.maphttproute(using system.web.routing)并指定routehandler
public static void register(httpconfiguration config) { routetable.routes.maphttproute( name: "defaultapi", routetemplate: "api/{controller}/{id}", defaults: new { id = routeparameter.optional } ).routehandler=new sessioncontrollerroutehandler(); }
或者 在mvc的webapi中默认是没有开启session会话支持的。需要在global中重写init方法来指定会话需要支持的类型
public override void init() { postauthenticaterequest += mvcapplication_postauthenticaterequest; base.init(); } void mvcapplication_postauthenticaterequest(object sender, eventargs e) { httpcontext.current.setsessionstatebehavior( sessionstatebehavior.required); }
或者:
public override void init() { this.postauthenticaterequest += (sender, e) => httpcontext.current.setsessionstatebehavior(sessionstatebehavior.required); base.init(); }
在默认情况下是没有开启的。sessionstatebehavior有四个值:
- default使用默认asp.net逻辑来确定请求的会话状态行为。默认逻辑是寻找ihttphandler中是否存在标记会话状态接口。
- disabled未启用会话状态来处理请求。 此设置将覆盖已通过检查请求的处理程序确定的任何会话行为。
- readonly为请求启用只读会话状态。这意味着会话状态无法更新。此设置将覆盖已通过检查请求的处理程序确定的任何会话状态行为。
- required为请求启用完全的读写会话状态行为。 此设置将覆盖已通过检查请求的处理程序确定的任何会话行为。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。