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

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

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

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

第二个类SessionControllerRouteHandler,继承自HttpControllerRouteHandler

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

完成这两个类之后,就可以进行下一步了。

第二步:修改WebApiConfig,给新手提示一下,这个类在Global中可以看到,WebApiConfig.Register(......这里在进行的。一般情况下,在App_Start目录下。由于我们是要让WebApi能获得MVC中Controller中设置的Session,故要重改一下这个配置。

 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了,例如:

Session["ValidCode"]="Session Test"

那么WebApi中就可以获取到了:

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

https://www.cnblogs.com/ca47/p/4603701.html

MVC4 Controller 与 WebApi 的 Session 传值问的更多相关文章

  1. C# WebApi的controller中如何存取session

    在MVC以后,Session方式可能已经不太常用,但偶尔还是会用到,比如页面验证码之类的.例如登录页面使用的验证码通过Controller提供一个View来实现,可以使用Session来存储这个值.但 ...

  2. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  3. Extjs4.2+webAPI+EF实现分页以及webapi的数据传值

    由于不明白分页的总数是怎么计算,不知道他的分页方式所以花费了好多功夫,现在弄出来了与大家分享下 1.首先是EF的简历,想必大家都清楚:添加-〉新建项-〉数据-〉Ado.net实体数据模型 2.就是后台 ...

  4. webapi中session为null的解决方案

    Session  webapi中session为null的解决方案 在Global.asax里添加:开启Session功能(默认是不开启) 重写init方法 public class WebApiAp ...

  5. 关于webApi使用session

    1.关于webApi使用session 在Global.asax中注册session添加以下代码 public override void Init() { //开启session this.Post ...

  6. MVC4+WebApi+Redis Session共享练习(下)

    上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务. 本篇例子采用的开发环境为:VS2010( ...

  7. MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...

  8. mvc4中的 webapi 的使用方式

    目录 一:简单介绍什么是Web api 二:怎么定义的 Post Get Put 和 Delete 三:简单使用,直接从前台传递一个类到后台接收 四:其他获取值的方式 一:简单介绍什么是Web api ...

  9. 在WebAPI使用Session

    最近在改写WebApp时要将以前用泛型处理例程写的Captcha 改成使用WebApi 来实作机制,在实作的过程中发现使用IRequiresSessionState session也无法使用(cont ...

随机推荐

  1. [svc]Iaas Paas Saas区别

    https://www.zhihu.com/question/20387284

  2. 逆向随笔 - switch 语句深入分析

    switch case 语句在c语言里还是比較简单的.可是被编译出来之后,优化结果往往让人非常疑惑.全然看不懂,以下我们一次次的尝试,看看编译器究竟把switch语句变成什么样了.   ① 先上个最简 ...

  3. Ubuntu 12.04安装和设置SSH服务

    OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件.而实现此功能的传统方式,如telnet(终端仿真协议). rc ...

  4. C++面向对象程序设计的一些知识点(5)

    摘要:运算符能给程序员提供一种书写数学公式的感觉,本质上运算符也是一种函数,因此有类内部运算符和全局运算符之分,通过重载,运算符的“动作”更加有针对性,编写代码更像写英文文章. 1.C++标准允许将运 ...

  5. Oracle update 日期

    UPDATE Sf_Msg_Monthly SET smm_Closed_Time = to_date('2011-12-30 11:54:30','yyyy-MM-dd HH24:MI:SS') ;

  6. win7语言设置为英语

    控制面板,地区和语言 可以设置格式 键盘和语言 安装显示的语言 选择“可选更新包”,选择语言的语言

  7. java web 应用中包,接口的设计

    采用标准的架构:描述从低层到高层首先是系统分析,找出你需要什么功能,然后按照下面的步骤执行: 数据库层:数据库层就是SQL语句.数据库.表.视图.触发器等等的创建和管理.这一层和JAVA无关,但是却是 ...

  8. 几行css3代码实现超炫加载动画

    之前为大家分享了css3实现的加载动画.今天为大家带来一款只需几行代码就可以实现超炫的动画加载特效.我们一起看下效果图: 在线预览   源码下载 实现代码: 极简的html代码: <div> ...

  9. Apache Httpd 反向代理配置 (笔记)

    Apache Httpd 配置Http反向代理 打开配置文件 httpd.conf 先启动相关模块(去掉前面的注释#)LoadModule proxy_module modules/mod_proxy ...

  10. 【高可用HA】Apache (2) —— Mac下安装多个Apache Tomcat实例

    Mac 下安装多个Apache Tomcat实例 tomcat版本:tomcat-8.0.29 参考来源: Installing Tomcat 7.0.x on OS X 在mac系统安装Apache ...