楔子:最近要上一个.net 的网站,而这个网站是采用 xslt 的,xslt 中有使用到自定义脚本 msxsl:script,但放到 godaddy 的服务器上去之后,却报出了黄页错误,错误如下:

 

Request failed.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Exception: Request failed.

 

经过多方的排查,发现是由于 xslt 文件中包含有 msxsl:script 脚本的原因造成的,进一步细究,发现执行 msxsl:script 需要代码执行权限为 full trust,而在 godaddy 的虚拟主机中,代码执行权限为 Medium 。

郁闷啊,我不太可能因为这样而放弃在 xslt 中执行 script,因为如果不能执行 script,那么 xslt 的开发难度将大增加,所以只好选择其它主机了。最让人郁闷的是,我刚刚在 godaddy 续费,早知如此,就不去他们家续费了。

随后,我又发信去 godaddy 和 lunarPages 咨询关于 full trust level 的事情,得到的答复是 godaddy 不支持,而 lp 是可以支持 full trust 的,godaddy 的主机是.net 1.1 支持 full trust level,而 lp 的主机则是完全支持的,那然后我也是花了一天的时间,去找关于 full trust 的主机,需要这个功能的朋友注意了。

哪些美国主机可以支持 Full Trust Level?

ixWebHosting 其实之前我也试过他们的主机,但是说句实在话,速度和稳定性方面实在是不也恭维,我当时是冲着 15 个 IP 去的,价格上要比 godaddy 略高,但加上送的 15 个 IP 以及 3 个免费域名,价格肯定要优于 godaddy 了,单单是 15 个独立 IP,就值 $2*15*12=360 美元了。但从我试用并监测二十来天的情况下来看,我个人认为 ix 的 windows 主机,基本上可以不考虑。

LunarPages 我没有用过,没有发言权了,但 idcspy 的版主说最近速度有些慢,也不推荐购买

arvixe.com 这个公司好像在网上没什么消息,中文有几篇文章都是说好的,不排除是托,也极有可能是中国人在国外搞的小主机公司,但有一点,他们是支持 Full Trust Level 的,有用过这个公司主机的朋友留下言。

WebHost4life 这个公司比较有意思,他们有中文的客户混在 idcspy 论坛里,使用的人好像也不多,但可以肯定的是,支持 full trust level 的。

最后一招,自己买 VPS/VDS 或者独立主机了,目前 godaddy 的 vds 一年大概要两千多吧,windows 主机最起码也得买 512 内存的了,太小了根本跑不起来,谁让 windows 系列产品都是吃内存大户呢。其它的也有便宜的,但我觉得应该要在 2500-3000 这个级别才可以用。

此外为了服务器安全,很多国外的 Asp.net 虚拟主机 (比如 GoDaddy) 都把设置代码执行权限设置为 Medium Trust Level,这时候,与 Full Trust Level 不同,Asp.net 程序会有很多限制。如果你正在开发通用的 Web 产品,比如 BBS 、 Blog 、 CMS 、 Portal,那么为了让产品能更大程度适应各种运行环境,你需要考虑到 Asp.net 中等安全模式的相关问题。

什么是中等安全模式?

Asp.net 通过信任级别 (Trust Level) 设置代码执行权限,默认有 5 种,分别是:Full 、 High 、 Medium 、 Low 、 Minimal 。虚拟主机提供商通常在系统的 machine.config 配置了<system.web><trust level=』Medium』 />…

常见异常信息:

 

Required permissions cannot be acquired.

Description: An unhandled exception occurred during the execution of the current web request.

Please review the stack trace for more information about the error and where it originated in the code.

SecurityException: Request for the permission of type 『System.Security.Permissions.ReflectionPermission failed

或者:

System.Security.SecurityException: Request for the permission of type 『System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′ failed.

 

中等安全模式有哪些限制?

CodeDom 、 Emit 以及基于 CodeDom 、 Emit 实现的 Ioc 、 AOP 技术无法使用。

VirtualPathProvider 无法使用。

BuildProvider 无法使用。

HttpWorkRequst 无法使用。

OleDb 无法使用。默认情况下 Access 数据库无法使用,不过 GoDaddy 可以通过管理面板将 Access 访问权限开启。

P/Invoke 无法使用。 System.Data.SQLite 及 sqlite-net 都 是通过 P/Invoke 调用 C 语言版本的 SQLite.dll 实现的,因此也不能使用了。

ReflectionPermission 及 RestrictedMemberAccess 无法访问,导致 Ado.net for Entity Framework 、 DB4O,以及好多 ORM 工具无法使用。

一些常见问题的解决办法

SQLite 无法使用:可以使用 Access 或 VistaDB 作为替换。

BlogEngine.net 默认安装时出错:只需将 Web.config 中的<system.web><trust level=』Medium』/> 删除即可。

LINQ to Entities / ADO.NET Entity Framework 无法使用:参考 http://mosesofegypt.net/post/Entity-Framework-minimum-permission-considerations.aspx

Discuz!net 无法使用:使用 YetAnotherForum 代替。