专栏首页追逐时光.NET WebAPI中使用Session使用

.NET WebAPI中使用Session使用

问题及其解决方案:

今天做项目的时候因为需要编写一个短信验证码的接口我需要在我的后台.net webapi中存入我随机生成的短信验证码方便与前端传递过来的数据对比,所以决定使用session做缓存。但是没想到的是我调用都是都是为空的。让后在网上找了下原因是因为Web Api的控制器类派生自ApiControll它只继承了IHttpController, IDisposable这两个接口,与 MVC Controll类没有直接关系,因此不能像在ASPX.CS代码隐藏类中直接使用HttpContext、HttpApplicationState或HttpSessionState等状态数据。要使用的话,一般是从System.Web.HttpContext.Current静态对象引用HttpContext,从而使用Session等状态数据。所以接下来我们需要做的是重写Global.asax中的方法,通过路由重写启用WEB API 中的session会话。

首先添加WEB API自定义路由:

public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
/// <summary>
/// 配合Gloabl.cs项目启动时默认调用
/// </summary>
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultAreaApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

//设置路由获取调转方式
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}

首先重写Global.asax:

public class MvcApplication : System.Web.HttpApplication
{
/// <summary>
/// 开始session会话
/// </summary>
protected void Application_PostAuthorizeRequest()
{
   if (IsWebApiRequest())
   {
     HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
   }
}
/// <summary>
/// 匹配WebApiconfig自定义路由规格
/// </summary>
/// <returns></returns>
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • async函数

    Generator函数的执行必须靠执行器,所以才有co模块,而async函数自带执行器。

    用户3258338
  • ES6 对象的扩展

    上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值

    Leophen
  • JavaScript组件设计思想(二)

    开发中,我们经常会遇到在用户登录成功后我们需要初始化“header”、“toolbar”、“menu”等情况。通常的做法是在登录成功回调中去调用对应模块的初始化...

    奋飛
  • 【Flutter 专题】29 易忽略的【小而巧】的技术点汇总 (五)

    和尚在做 Android 时经常会双击快速点击返回键弹出退出对话框,之后在进行操作,而 Flutter 也提供了监听返回导航的 WillPopSco...

    阿策
  • Numpy 常用函数和属性(一)

    np.arange([start,] stop[, step,], dtype=None) : 略(前面某篇介绍过)

    用户6021899
  • 深入理解ES6之—对象

    在js中比较两个值时,你可能会用相等运算符==或者严格相等运算符 ===。为了避免在比较时发生强制类型转换,许多开发者更倾向于使用后者。

    寻找石头鱼
  • 深入理解ES6--对象、函数扩展

    javascript引擎会在访问作用域中查找其同名变量;如果找到,则变量的值被赋给对象字面量的同名属性。

    奋飛
  • Java程序员最常犯的 10 个错误!

    使用Arrays.asList()方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽...

    Java技术栈
  • 一文彻底读懂response.setContentType()的作用及参数

    链接:https://blog.csdn.net/luman1991/article/details/53423305#comments

    用户5224393
  • JS中数组的深拷贝和浅拷贝

    变量保存的是一个指针,存放在栈内存中,指针指向一个位置,这个位置就是存放在堆内存引用类型的值

    杨肆月

扫码关注云+社区

领取腾讯云代金券