要是你正在开辟一个通用型的Web产品,比如BBS、CMS、BLOG这类的,那么,发起你阅读以下本篇文章。
非通用型的Web步伐或产品,通常不会和ASP.NET中等寂静模式打交道,由于面对的用户群领会比较牢固,大概摆设环境是可以由步伐提供者决定的。
但在做通用型的Web产品的时间,你就要和种种人打交道了,有的站长用的是外洋空间,比如GoDaddy,外国的空间商通常会把ASP.NET代码实行权限控制在中等寂静模式。
而在中等寂静模式下,很多我们屡见不鲜的事变都是做不了的。
中等寂静模式是什么?
大概很多人都没打仗过中等寂静模式,我在参加bbsmax项目之前,我也不知道有中等寂静模式这么个东西。
大略来说,ASP.NET提供了一个大略设置代码实行权限的方案,叫做“信托级别”。
它默认提供5种信托级别,分别是:FullTrust、High、Medium、Low、Minimal。
每个信托级别的设置,分别对应于一组代码权限设置。
这个方案,让网站摆设者可以通过web.config快速设置网站的托管代码实行权限。
通过对web.config的《system.web》/《trust》节点的level属性值举行设置,就可以将ASP.NET步伐设置到差别的信托级别。
ASP.NET安顿完,全部网站默认都是FullTrust信托级别,也是最高信托级别。
本文说的“中等寂静模式”便是对应于Medium信托级别。
由于托管代码实行权限模型不是本文讨论的重点,以是我这里只做大略的阐明,不深入讨论ASP.NET寂静级别设置的实现原理,实现原理可以参考本文末了给出的几个连接。
中等寂静模式会有哪些影响?
以下是我和我的同事在ASP.NET中等寂静模式下曾经遇到过的一些题目:
1. 基于VirtualPathProvider的模板机制不克不及用,由于VirtualPathProvider至少必要运行在High模式。
2. BuildProvider不克不及用,意味着你想本身添加本身的语言实现也不克不及用了,不过大部分项目不会用到这么高级的东西。
3. CodeDom、Emit不克不及用了,这下惨了,什么Ioc、AOP,动态注入的高科技玩意儿,全都废了,这些不是基于CodeDom的便是基于Emit的。
4. 通过aspx页面担当文件下载也不可了,Response写文件流到客户端必要更高的代码实行权限。
5. 大文件上传也别想了,由于大文件上传万变不离HttpWorkRequst,获取HttpWorkRequst的代码必要FullTrust模式。
6. SQLite不克不及用了,由于中等寂静模式下没有非托管代码调用权限,以是除了SQLite外,涉及到非托管代码调用的,也都废失了。
7. Access数据不克不及用OleDb连接了,由于中等寂静模式下,OleDbClient是不克不及用的,你只能用ODBC数据源。
以是,要是要思量容许让用户把步伐摆设到中等寂静模式下,那就越早做中等寂静模式的兼容性测试越好。
由于很多不克不及用的东西,都是涉及到底子布局的。
比如,SQLite和Access不克不及用,你的步伐要是正巧就只做这两个数据库的版本,咋办?
比如,文件下载不克不及通过Response写文件流的方法,你的步伐正巧又是这么做防盗链,咋办?
中等寂静模式要求那么苛刻,怎么敷衍?
只能绕道走了,要不然怎么办?要领还是有的,得不绝实行。
VirtualPathProvider不克不及用,BuildProvider也不克不及用,但是又必要有本身的一套模板语法。那只幸亏页面访问前世成aspx页面,再做URL重写了。
提及来很大略,就一句话。但是这中间我不知道写了多少代码,做了多少次试验,才找到最佳方案。
以是,你的要领还是得你本身找。
以下是坚决步伐是否运行在中等寂静模式的代码:
以下为引用的内容: if (SecurityManager.IsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevel.Medium))) { } |
要是有遇到不是必须实行的逻辑,比如获取步伐内存占用率大概大文件上传,那就可以先坚决下,再决定是否调用。
根据资料表现,把步伐集摆设到GAC中,可以得到FullTrust级别的权限,不过我没有实际试过。
附录A
参考链接:
MSDN 《How To: Use Medium Trust in ASP.NET 2.0》
《Check Code Access Security Permissions Granted to your asp.net web application》
附录B
辰提供的文件下载方案:
以下为引用的内容: protected override void OnInit(EventArgs e) { Response.ContentType = "application/octet-stream"; using (FileStream stream = File.Open(Server.MapPath("~/test.txt"), FileMode.Open)) { BinaryWriter writer = new BinaryWriter(Response.OutputStream); byte[] buffer = new byte[1024]; int l = 0; while ((l = stream.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, l); } } } |