asp.net 读取RedisSessionStateProvider配置

最近项目遇到需要读取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 % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }
    }

先修改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文件, 网上有你很多, 一定给要记住修改签名哦哦。

时间: 2024-09-30 06:06:59

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

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

本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二.当Configuration对象承载的配置放生变换的时候如何向应用程序发送通知,最终让应用程序使用最新的配置. 一.配置与配置源的同步 配置模型提供了三个原生ConfigurationProvider(JsonConfigrationProvider.XmlConfigurationProvider和IniC

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

ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程序中的使用的配置信息如何与之同步呢?如果需要在应用程序中实现对配置信息的实施同步,就需要对原始配置数据的进行监控,并在数据改变的时候重新加载配置数据.除此之外,重新加载的配置需要应用到程序中,我们必然需要一种通知机制. 为了让读者朋友们对配置同步机制在具体项目中的应用有个感官认识,我们先通过一个简单

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

我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所示,基于Options模型的配置绑定的编程基本采用这样的模式:先后调用ServiceCollection的扩展方法AddOption和Configure注册Options模型相关的服务并完成Options类型与指定配置节之间的映射,然后利用由此生成ServiceProvider获得一个类型为IOptions&

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

出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Options对象.我们在本章第一节通过简单的实例演示了如何利用Options模型实现了配置数据向Options对象的绑定,现在我们对Options模型背后的实现原理进行详细介绍. 目录一.ConfigurationBinder二.绑定简单对象三.绑定复杂对象四.绑定集合对象五.绑定字典对象 一.Conf

Asp.net Web.Config - 配置元素customErrors

Asp.net配置文件的配置方式,其实在MSDN里面是写得最清楚的了.可惜之前一直未曾了解到MSDN的强大. 先贴个地址:http://msdn.microsoft.com/zh-cn/library/dayb112d(v=vs.80).aspx,然后逐个分析.我希望自己能够从头到尾认真学完这系列东西.为了不至于让自己太早放弃,我决定从自己用过的配置文件学起,然后逐渐接触那些比较生疏,和少用的. 一.customErrors 元素 属性 说明 defaultRedirect 指定出错时将浏览器定

C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示

跟大家分享一下,[摘自]:http://blog.csdn.net/li185416672/article/details/8213729 读取excel时,某些单元格为空值 原来如此: 当我们用olebb读取excel的时候,如果没有配置imex=1的属性,微软的处理机制是将列转换为同一类型来读取的.例如你在第一行写的数字格式,而第二行写的字符格式,就会出现某些列有值却读不出来.其实问题也很简单,如果知道问题所在的话.属性设置为"imex=1"即可 附以下参考: string xls

golang 读取 ini配置信息

package main //BY: [email protected]//这个有一定问题   如果配置信息里有中文就不行//[Server] ;MYSQL配置//Server=localhost   ;主机//golang 读取 ini配置信息//http://www.widuu.com/archives/02/961.htmlimport (  "fmt"  "github.com/widuu/goini"  //"runtime"  //&

asp.net读取CSV-千分之想

用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了 特意收集两篇Excel跟CSV读取相关的两篇文章 asp.net读取excel文件,将excel文件先上传,在读取,最后删除. 但有一个问题,那就是excel文件夹需要有读写的权限,IIS需要为asp.net用户开通权限的. 而且excel文件本身存在安全隐患,那就是它可以运行vba程序.所以从安全角度考虑,上传excel是个不好的方法. 今天介绍另一种方法,读取CVS文件. Step1.拖一个file

Asp.Net 读取Excel内容超过255个字符被截断

.csv类型的单元格不能超过255,要转成xls格式 Asp.Net 读取Excel内容超过255个字符被截断,这问题很莫名其妙的,有时候是单元格直接被截断,有时候是C#操作读取时被截断,要想好好导入,也不容易.... 当单元格复制字符串或导入时,字符串就被截断,注意新建Excel的文件保存类型,多试几个相关类型试试; C#操作读取时被截断,如果查看单元格字符串是对的,那看看是不是以下的问题: 用Ado读取数据时,对于超过255个字符的单元格,必须在前1-8列,大于255个字符的单元格第一行数据