MVC4 Controller 与 WebApi 的 Session 传值问题

在MVC之后,Session方式可能已经不太经常使用,但偶尔仍是会用到,好比页面验证码之类的。例如登陆页面使用的验证码经过Controller提供一个View来实现,可使用Session来存储这个值。但如今经常使用的请求均可以交给WebApi来处理,按照默认方式架设的MVC4的应用中,WebApi是取不到由Controller保存的Session值的,那么,咱们须要进行必定的配置。记录以下:api

第一步:简单创建两个类,以备修改WebApi的路由方式ide

第一个类SessionRouteHandler,继承自HttpControllerHandler,并同时实现一下IRequiresSessionState接口,其实IRequiresSessionState是没有内部方法的,所以也不须要写啥。ui

1 public class SessionRouteHandler : HttpControllerHandler,IRequiresSessionState 2 {
3         public SessionRouteHandler(RouteData routeData) : base(routeData)
4         {
5         }
6 }

第二个类SessionControllerRouteHandler,继承自HttpControllerRouteHandlerspa

1 public class SessionControllerRouteHandler : HttpControllerRouteHandler 2 {
3         protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
4         {
5             return new SessionRouteHandler(requestContext.RouteData);
6         }
7 }

完成这两个类以后,就能够进行下一步了。code

第二步:修改WebApiConfig,给新手提示一下,这个类在Global中能够看到,WebApiConfig.Register(......这里在进行的。通常状况下,在App_Start目录下。因为咱们是要让WebApi能得到MVC中Controller中设置的Session,故要重改一下这个配置。blog

 1 public static class WebApiConfig
 2 {
 3     public static void Register(HttpConfiguration config)
 4     {
 5             //config.Routes.MapHttpRoute(
 6             //    name: "DefaultApi",
 7             //    routeTemplate: "api/{controller}/{id}",
 8             //    defaults: new { id = RouteParameter.Optional }
 9             //);
10             //Route上传递Session
11             RouteTable.Routes.MapHttpRoute(
12                 name: "DefaultApi",
13                 routeTemplate: "api/{controller}/{id}",
14                 defaults: new {id = RouteParameter.Optional}).RouteHandler = new SessionControllerRouteHandler();
15     }
16 }

这里从RouteTable直接配置,并指定了RouteHandler为咱们第一步创建的SessionControllerRouteHandler。但这些工做都作了,Session的传递仍是会不成功的,由于这里咱们要指定一下Behavior。继承

第三步:修改Global。接口

在Global的cs代码中,重载它的Init方法,代码以下:路由

1 public override void Init()
2 {
3      PostAuthenticateRequest += (s, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
4      base.Init();
5 }

好了,所有完成后能够编译了,这时候,你能够在Controller中按照正常方式创建Session了,例如:it

Session["ValidCode"]="Session Test"

那么WebApi中就能够获取到了:

HttpContext.Current.Session["ValidCode"].ToString()

本篇完结

相关文章
相关标签/搜索