• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 解读ASP.NET 5 & MVC6系列教程(8):Session与Caching

解读ASP.NET 5 & MVC6系列教程(8):Session与Caching

作者:汤姆大叔 字体:[增加 减小] 来源:互联网 时间:2017-05-11

汤姆大叔通过本文主要向大家介绍了精通asp.net mvc 5,html5 asp.net,pro asp.net mvc 5,asp net mvc 5,asp net培训等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了ASP.NET 5中一个可配置的模块(middleware)了。

配置启用Session

ASP.NET 5中的Session模块存在于Microsoft.AspNet.Session类库中,要启用Session,首先需要在project.json中的dependencies节点中添加如下内容:

"Microsoft.AspNet.Session": "1.0.0-beta3"
</div>

然后在ConfigureServices中添加Session的引用(并进行配置):

services.AddCaching(); // 这两个必须同时添加,因为Session依赖于Caching
services.AddSession();
//services.ConfigureSession(null); 可以在这里配置,也可以再后面进行配置
</div>

最后在Configure方法中,开启使用Session的模式,如果在上面已经配置过了,则可以不再传入配置信息,否则还是要像上面的配置信息一样,传入Session的配置信息,代码如下:

app.UseInMemorySession(configure:s => { s.IdleTimeout = TimeSpan.FromMinutes(30); });
//app.UseSession(o => { o.IdleTimeout = TimeSpan.FromSeconds(30); });
//app.UseInMemorySession(null, null); //开启内存Session
//app.UseDistributedSession(null, null);//开启分布式Session,也即持久化Session
//app.UseDistributedSession(new RedisCache(new RedisCacheOptions() { Configuration = "localhost" }));
</div>

对于UseInMemorySession方法,接收2个可选参数,分别是:IMemoryCache可用于修改Session数据的默认保存地址;Action<SessionOptions>委托则可以让你修改默认选项,比如Session cookie的路径、默认的过期时间等。本例中,我们修改默认过期时间为30分钟。

注意:该方法必须在app.UseMvc之前调用,否则在Mvc里获取不到Session,而且会出错。

获取和设置Session

获取和设置Session对象,一般是在Controller的action里通过this.Context.Session来获取的,其获取的是一个基于接口ISessionCollection的实例。该接口可以通过索引、Set、TryGetValue等方法进行Session值的获取和设置,但我们发现在获取和设置Session的时候,我们只能使用byte[]类型,而不能像之前版本的Session一样可以设置任意类型的数据。原因是因为,新版本的Session要支持在远程服务器上存储,就需要支持序列化,所以才强制要求保存为byte[]类型。所以我们在保存Session的时候,需要将其转换为byte[]才能进行保存,并且获取以后要再次将byte[]转换为自己的原有的类型才行。这种形式太麻烦了,好在微软在Microsoft.AspNet.Http命名空间(所属Microsoft.AspNet.Http.Extensions.dll中)下,为我们添加了几个扩展方法,分别用于设置和保存byte[]类型、int类型、以及string类型,代码如下:

public static byte[] Get(this ISessionCollection session, string key);
public static int? GetInt(this ISessionCollection session, string key);
public static string GetString(this ISessionCollection session, string key);
public static void Set(this ISessionCollection session, string key, byte[] value);
public static void SetInt(this ISessionCollection session, string key, int value);
public static void SetString(this ISessionCollection session, string key, string value);
</div>

所以,在Controller里引用Microsoft.AspNet.Http命名空间以后,我们就可以通过如下代码进行Session的设置和获取了:

Context.Session.SetString("Name", "Mike");
Context.Session.SetInt("Age", 21);

ViewBag.Name = Context.Session.GetString("Name");
ViewBag.Age = Context.Session.GetInt("Age");
</div>

自定义类型的Session设置和获取

前面我们说了,要保存自定义类型的Session,需要将其类型转换成byte[]数组才行,在本例中,我们对bool类型的Session数据进行设置和获取的代码,示例如下:

public static class SessionExtensions
{
 public static bool? GetBoolean(this ISessionCollection session, string key)
 {
  var data = session.Get(key);
  if (data == null)
  {
   return null;
  }
  return BitConverter.ToBoolean(data, 0);
 } 

 public static void SetBoolean(this ISessionCollection session, string key, bool value)
 {
  session.Set(key, BitConverter.GetBytes(value));
 }
}
</div>

定义bool类型的扩展方法以后,我们就可以像SetInt/GetInt那样进行使用了,示例如下:

Context.Session.SetBoolean("Liar", true);
ViewBag.Liar = Context.Session.GetBoolean("Liar");
</div>

另外,ISessionCollection接口上还提供了Remove(string key)和Clear()两个方法分别用于删除某个Session值和清空所有的Session值的功能。但同时也需要注意,该接口并没提供之前版本中的Abandon方法功能。

基于Redis的Session管理

使用分布式Session,其主要工作就是将Session保存的地方从原来的内存换到分布式存储上,本节,我们以Redis存储为例来讲解分布式Session的处理。

先查看使用分布式Session的扩展方法,示例如下,我们可以看到,其Session容器需要是一个支持IDistributedCache的接口示例。

public static IApplicationBuilder UseDistributedSession([NotNullAttribute]this IApplicationBuilder app, IDistributedCache cache, Action<SessionOptions> configure = null);
</div>

该接口是缓存Caching的通用接口,也就是说,只要我们实现了缓存接口,就可以将其用于Session的管理。进一步查看该接口发现,该接口中定义的Set方法还需要实现一个ICacheContext类型的缓存上下文(以便在调用的时候让其它程序进行委托调用),接口定义分别如下:

public interface IDistributedCache
{
 void Connect();
 void Refresh(string key);
 void Remove(string key);
 Stream Set(string key, object state, Action<ICacheContext> create);
 bool TryGetValue(string key, out Stream value);
}

public interface ICacheContext
{
 Stream Data { get; }
 string Key { get; }
 object State { get; }

 void SetAbsoluteExpiration(TimeSpan relative);
 void SetAbsoluteExpiration(DateTimeOffset absolute);
 void SetSlidingExpiration(TimeSpan offset);
}
</div>

接下来,我们基于Redis来实现上述功能,创建RedisCache类,并继承IDistributedCache,引用StackExchange.Redis程序集,然后实现IDistributedCache接口的所有方法和属性,代码如下:

using Microsoft.Framework.Cache.Distributed;
using Microsoft.Framework.OptionsModel;
using StackExchange.Redis;
using System;
using System.IO;

namespace Microsoft.Framework.Caching.Redis
{
 public class RedisCache : IDistributedCache
 {
  // KEYS[1] = = key
  // ARGV[1] = absolute-expiration - ticks as long (-1 for none)
  // ARGV[2] = sliding-expiration - ticks as long (-1 for none)
  // ARGV[3] = relative-expiration (long, in seconds, -1 for none) - Min(absolute-expiration - Now, sliding-expiration)
  // ARGV[4] = data - byte[]
  // this order should not change LUA script depends on it
  private const string SetScript = (@"
    redis.call('HMSET', KEYS[1], 'absexp', ARGV[1], 'sldexp', ARGV[2], 'data', ARGV[4])
    if ARGV[3] ~= '-1' then
     redis.call('EXPIRE', KEYS[1], ARGV[3]) 
    end
    return 1");
  private const string AbsoluteExpirationKey = "absexp";
  private const string SlidingExpirationKey = "sldexp";
  private const string DataKey = "data";
  private const long NotPresent = -1;

  private ConnectionMultiplexer _connection;
  private IDatabase _cache;

  private readonly RedisCacheOptions _options;
  private readonly string _instance;

  public RedisCache(IOptions<RedisCacheOptions> optionsAccessor)
  {
   _options = optionsAccessor.Options;
   // This allows partitioning a single backend cache for use with multiple apps/services.
   _instance = _options.InstanceName 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET MVC从视图传参到控制器的几种形式
  • ASP.NET MVC 4 中的JSON数据交互的方法
  • ASP.NET MVC制作404跳转实例(非302和200)
  • 详解ASP.NET MVC 利用Razor引擎生成静态页
  • 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
  • Asp.net MVC下使用Bundle合并、压缩js与css文件详解
  • 详解Asp.Net MVC——控制器与动作(Controller And Action)
  • ASP.NET MVC生成静态页面的方法
  • ASP.NET MVC 导出Word报表

相关文章

  • 2017-05-11一步一步asp.net ajax类别Tree生成
  • 2017-05-11litjson读取数据示例
  • 2017-05-11请求如何进入ASP.NET MVC框架
  • 2017-05-11用类的继承关系(重写父类的方法)实现简易后台代码模板
  • 2017-05-11ASP.NET Session对象保持会话使用说明
  • 2018-08-20详解ASP.NET Core 2.0 路由引擎之网址生成(译)
  • 2017-05-11asp.net获取ListView与gridview中当前行的行号
  • 2018-08-20.NET Core2.1如何获取自定义配置文件信息详解
  • 2017-05-11asp.net实现输出xml的方法
  • 2017-05-11ASP.NET 计划任务实现方法(不使用外接程序,.net内部机制实现)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 在ASP.NET中下载文件的实现代码
    • ASP.NET中相对路径的使用总结
    • ASP.NET Mvc开发之EF延迟加载
    • .aspx中的命名空间设置实现代码
    • asp.net运行原理 详解
    • 微信小程序基于腾讯云对象存储的图片上传功能
    • 利用Typings为Visual Studio Code实现智能提示功能
    • asp.net 删除,更新数据库方法
    • ASP.NET静态页生成方法
    • ASP.NET 缓存分析和实践浅析提高运行效率

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有