最近项目遇到需要读取RedisSessionStateProvider配置文件applicationName节点,如:

读取的方法有很多:

1直接读取web.config文件,

  void test1()
{
SessionStateSection config = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
string providerName = config.CustomProvider;
ProviderSettings ps = config.Providers[providerName];
string str = ps.Parameters["applicationName"];
}

2通过SessionStateStoreProviderBase来访问对象属性, 可惜的是对应的属性及类都是内部的,所以我们需要用到反射。

所以编码为如下:

  void test2()
{
var type = typeof(RedisSessionStateProvider);
//获取RedisSessionStateProvider的静态configuration字段
var configField = type.GetField("configuration", BindingFlags.Static | BindingFlags.NonPublic);
var configValue = configField.GetValue(new RedisSessionStateProvider());
type = configField.FieldType;
//获取configuration的ApplicationName属性
var prop = type.GetProperty("ApplicationName");
var obj = prop.GetValue(configValue).ToString();
} T GetSessionStateStoreProviderBase<T>() where T : SessionStateStoreProviderBase, new()
{
SessionStateSection config = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
string providerName = config.CustomProvider;
ProviderSettings ps = config.Providers[providerName];
ProviderBase provide = ProvidersHelper.InstantiateProvider(ps, typeof(T));
return (provide as T);
}

3 次方法和方法2一样好,直接放问实例或对象的属性,ProviderConfiguration和configuration属性都是内部的,我们可以不通过修改源码(或者用mono ceil 来修改dll文件)使ProviderConfiguration类和configuration属性成为public。 那么code就很简单了

string applicationName1 = RedisSessionStateProvider.configuration.ApplicationName;

4 用mono ceil 来修改dll文件,方法3是找到源码直接修改,这里方法4是没有源码,用monon修改的。我们新建一个控制台应用程序,添加

<package id="Mono.Cecil" version="0.9.6.0" targetFramework="net46" />

    using System;
using System.IO;
using System.Linq;
using Mono.Cecil;
class Program
{
static void Main(string[] args)
{
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Microsoft.Web.RedisSessionStateProvider.dll");
AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(filePath);
TypeDefinition[] types = asm.MainModule.Types.ToArray(); //修改ProviderConfiguration为public
TypeDefinition typeConfiguration = types.FirstOrDefault(x => x.Name == "ProviderConfiguration");
typeConfiguration.IsPublic = true; //修改ProviderConfiguration的字段为public
TypeDefinition typeRedisProvide = types.FirstOrDefault(x => x.Name == "RedisSessionStateProvider");
FieldDefinition filedConfiguration = typeRedisProvide.Fields.ToArray().FirstOrDefault(x => x.Name == "configuration");
filedConfiguration.IsPublic = true; //修改程序集的签名
foreach (ModuleDefinition item in asm.Modules)
{
var assemblyName = item.Assembly.Name;
assemblyName.PublicKey = GetPublicKey();
assemblyName.PublicKeyToken = GetPubliKeyToken();
}
//保存dll文件
filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Microsoft.Web.RedisSessionStateProvider2.dll");
asm.Write(filePath); //Console.ReadLine();
}
private static byte[] GetPublicKey()
{
string s = @"00240000048000009400000006020000002400005253413100040000010001005b0b4a219a91bee970338aadc8890eb73db3a87500c9b82cf605bebdb64f74769a213fbdf0476641c728281ffb5bb700c7f0a55f5407bfe984eb4abfd947ddbc6476c8ea4c5207421750dc2385fd99163cbb12df87190793552334614985258c830b8d960b5e21c5a0cc6be0941b3d1777c8a09d22db62ed59e5540822c6289b";
return StrToHexBytes(s);
}
private static byte[] GetPubliKeyToken()
{
string s = "f68305d2ab29aee8";
return StrToHexBytes(s);
}
private static byte[] StrToHexBytes(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % ) != )
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / ];
for (int i = ; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * , ), );
return returnBytes;
}
}
 

GetPublicKey 和GetPubliKeyToken 字符串来源于

先修改Microsoft.Web.RedisSessionStateProvider.dll 文件 另存为Microsoft.Web.RedisSessionStateProvider2.dll,在放到特定目录下 改为Microsoft.Web.RedisSessionStateProvider.dll 对其修改签名。

代用方式和方法3一样 就一行code   string applicationName1 = RedisSessionStateProvider.configuration.ApplicationName;

http://blog.csdn.NET/ma_jiang/article/details/7936235

整个项目需要用nuget 来安装Microsoft.Web.RedisSessionStateProvider。至于用mono ceil 来修改dll文件, 网上有你很多, 一定给要记住修改签名哦哦。

当然偶尔也有写入Config的需求:比如我想把redis 连接串放到一个单独的config文件里面如:

<appSettings>
<add key="RedisConnectionString" value="127.0.0.1:6379,abortConnect=false,connectRetry=3,connectTimeout=3000,defaultDatabase=2,syncTimeout=3000,version=3.2.1,responseTimeout=3000"/>
</appSettings>

那么什么时候可以把它覆盖到我们配置对象中了:

       protected void Application_Start(object sender, EventArgs e)
{
SessionStateSection config = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
string providerName = config.CustomProvider;
ProviderSettings ps = config.Providers[providerName];
// string str = ps.Parameters["applicationName"];
string connStr = ConfigurationManager.AppSettings["RedisConnectionString"];
ps.Parameters["connectionString"] = connStr;
}

读取有几种方式那么 写入也就有对应的几种方式。

asp.net 读取RedisSessionStateProvider配置的更多相关文章

  1. ASP.NET Core的配置(1):读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  2. ASP.NET Core的配置(5):配置的同步[设计篇]

    本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二. ...

  3. ASP.NET Core的配置(5):配置的同步[ 实例篇]

    ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程 ...

  4. ASP.NET Core的配置(4):多样性的配置来源[下篇]

    我们在上篇和中篇对配置模型中默认提供的各种ConfigurationProvider进行了深入详尽的介绍,如果它们依然不能满足项目中的配置需求,我们可以还可以通过自定义ConfigurationPro ...

  5. ASP.NET Core的配置(4):多样性的配置来源[中篇]

    我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,针对XML文件的XmlConfiguat ...

  6. ASP.NET Core的配置(4):多样性的配置来源[上篇]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命 ...

  7. ASP.NET Core的配置(3): 将配置绑定为对象[下篇]

    我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所 ...

  8. ASP.NET Core的配置(3): 将配置绑定为对象[上篇]

    出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...

  9. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

随机推荐

  1. Java 第五章 循环结构1

    循环结构 1 while 循环结构 ,do- while 循环结构 . 循环结构: 必须满足两个条件 . 1,循环条件 和 循环 操作 ! while 循环 特点:先判断,再执行 , 编码规范:缩进, ...

  2. 编译器问题:运行maven,报错-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.

    1.新建环境变量M2_HOME 2.指向你的maven安装目录 例如 :M2_HOME=D:\Apps\apache-maven-3.3.9 3.进入Myeclipse进行修改,Window-> ...

  3. JSHint 使用说明

    SHint介绍 翻译自www.jshint.comJSHint(注意不是jslint:))是一个由javascript社区驱动开发的用于检查javascript代码错误和问题的工具,有了他,可以使你保 ...

  4. WPF 虚拟键盘

    之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件. 现将代码分享如下: 按键布局如下: <Button Name="> <StackPanel Orie ...

  5. PHP程序设计经典300例

    不知道怎么转载,原文源自:http://bbs.php100.com/u-htm-uid-330857.html 来自:php100钟泽锋 第一例<?php $s_html="< ...

  6. CentOS6.5 解压安装 二进制分发版 mysql-5.5.49-linux2.6-x86_64.tar.gz

    环境:CentOS 6.5 64位 1.下载安装包 http://dev.mysql.com/downloads/mysql/5.5.html#downloads http://dev.mysql.c ...

  7. Swift经典知识整理

    1  关于Swift Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采用安全 ...

  8. Makecert.exe(证书创建工具)

    Makecert.exe(证书创建工具) .NET Framework 4.5   其他版本   2(共 3)对本文的评价是有帮助 - 评价此主题   证书创建工具生成仅用于测试目的的 X.509 证 ...

  9. SQL语句汇总(二)——数据修改、数据查询

    首先创建一张表如下,创建表的方法在上篇介绍过了,这里就不再赘述. 添加新数据: INSERT INTO <表名> (<列名列表>) VALUES (<值列表>)  ...

  10. Dynamic CRM 2013学习笔记(十四)复制/克隆记录

    经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...