ASP.NET 2.0/3.5 共享托管配置

作者:Walter Oliver

介绍

IIS 为动态内容(尤其是 ASP.NET)提供增强功能。 在 IIS 7 及更高版本中,ASP.NET 运行时扩展性模型已集成到核心服务器中。 这样,开发人员就可以利用 ASP.NET 2.0 或更高版本和 .NET Framework 的丰富功能全面扩展 IIS,而无需使用较低级别的 C++ API。 现有的 ASP.NET 应用程序将受益于更紧密的集成,因为它们可以使用现有的功能,如窗体身份验证、角色和所有类型内容的输出缓存,而不仅仅是 .aspx 页面。

若要详细了解 ASP.NET 与 IIS 集成的一些关键功能和优势,请参阅核心 Web 服务器概述。 有关如何安装 .NET Framework 3.5 的信息,请参阅 https://www.microsoft.com/net/ASP.NET 社区站点

在“托管指南”的“规划共享托管体系结构”一文中提到的共享托管体系结构中,Web 服务器上使用了以下设置。 若要详细了解推荐这些设置的原因以及有关如何配置这些设置的其他详细信息,请下载 ASP.NET 4 托管部署指南

配置信任级别

可使用信任级别为 ASP.NET 定义安全规则。 它们定义了应用程序可以执行的操作类型,例如从磁盘读取或访问注册表。 建议的信任级别为“中”,允许许多常见操作,但限制许多危险应用。 如果需要允许比“中”信任级别允许更多的操作,则应创建自定义信任级别。

配置自定义信任级别并配置其他权限

  1. 导航到 %windir%\Microsoft.NET\Framework \{version}\ CONFIG 目录。

  2. 复制“中”信任策略文件 web_mediumtrust.config,在同一目录 %windir%\Microsoft.NET\Framework\{version}\ CONFIG\ 下创建新策略文件。

  3. 重命名文件以指示它是自定义信任级别,例如 web_CustomTrust.config。

  4. 打开新文件 web_CustomTrust.config,找到 WebPermission 部分。

    ...

    <IPermission class="WebPermission"
    
    version="1"
                   <ConnectAccess>
                       <URI uri="$OriginHost$" />
                   </ConnectAccess>
         </IPermission>
    

    ...

  5. 编辑 WebPermission,以便删除 ConnectAccess 元素,并将“不受限制”设置为 true

    ...

    <IPermission class="WebPermission"
    
    version="1" 
                      Unrestricted="true"/>
    

    ...

  6. 注释禁止 PrintingPermission 和 EnvironmentPermission,除非已知共享托管环境需要它们

  7. 将新的 <trustLevel> 元素添加到 Web.config 文件的 <securityPolicy> 部分,如下所示:

    <location allowOverride="true">
    
        <system.web>
          <securityPolicy>
           <trustLevel name="Full" policyFile="internal" />
           <trustLevel name="High" policyFile="web_hightrust.config" />
           <trustLevel name="Medium" policyFile="web_mediumtrust.config" />
           <trustLevel name="Low" policyFile="web_lowtrust.config" />
           <trustLevel name="Minimal" 
                       policyFile="web_minimaltrust.config" />
           <trustLevel name="Custom" policyFile="web_CustomTrust.config" />
          </securityPolicy>
          <trust level="Custom" originUrl="" />
         </system.web>
    </location>
    
  8. 锁定信任级别,使服务器上的应用程序无法更改信任级别,方法是将 location allowOverride 元素设置为 false

    <location allowOverride="false">
        <system.web>
          <securityPolicy>
           <trustLevel name="Full" policyFile="internal" />
           <trustLevel name="High" policyFile="web_hightrust.config" />
           <trustLevel name="Medium" policyFile="web_mediumtrust.config" />
           <trustLevel name="Low" policyFile="web_lowtrust.config" />
           <trustLevel name="Minimal" 
                       policyFile="web_minimaltrust.config" />
           <trustLevel name="Custom" policyFile="web_CustomTrust.config" />
          </securityPolicy>
          <trust level="Custom" originUrl="" />
         </system.web>
    </location>
    

配置要从远程文件服务器提供的内容

将 ASP.NET 配置为处理存储在远程文件服务器上的内容时,需要执行一些其他步骤。

当 IIS 从远程文件服务器接收内容时,它将模拟经过身份验证的用户。 这是专门设置为虚拟目录用户的用户,如果没有指定,则是匿名用户。 IIS 指南规定,应用程序池用户应作为匿名用户使用,因此在这种情况下,模拟标识是应用程序池标识。 对所有访问(匿名、应用程序池和虚拟目录)使用一个标识可以大大简化部署。

若要从远程文件服务器运行某些 ASP.NET 应用程序,模拟用户必须有权访问 Windows 临时目录和临时编译目录。

从文件服务器共享提供 ASP.NET 内容

  1. 通过编辑文件夹的 ACL,向 %windir%\Temp 目录授予所有应用程序池标识的权限。

  2. 添加代码访问安全性 (CAS) 策略,以允许 ASP.NET 对文件服务器共享的适当访问。 为此,打开命令提示符并运行以下命令:

    %windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag 1.  -url "file://\\remotefileserver\content$\*" FullTrust
    

配置垃圾回收器设置

.NET Framework 使用自动垃圾回收来管理所有应用程序的内存。 当垃圾回收器 (GC) 认为已经积累了足够多的垃圾,而且这样做是有效的,它就会执行一次回收,释放一些内存。 此过程是完全自动的,但有一些设置可以使该过程更高效。

有关 GC 的详细信息,请参阅“第 5 章 - 改进托管代码性能”,并查看垃圾回收说明部分。

启用工作站垃圾回收器

默认情况下,.NET Framework 使用服务器 GC 来优化速度和 CPU 负载。 对于共享托管,内存往往是多个活动站点的限制因素,因此应使用工作站 GC。 工作站 GC 针对内存进行优化。

若要了解有关此设置的详细信息,请参阅知识库文章“在运行 Windows Server 2003 的计算机上托管使用 ASP.NET 的 Web 应用程序时,可能会收到错误消息或计算机停止响应”(https://support.microsoft.com/kb/911716)

禁用并发垃圾回收器

GC 有 3 个版本:服务器、启用并发功能的工作站和禁用并发功能的工作站。 并发工作站 GC 适用于客户端方案。 正如服务器 GC 以内存为代价优先考虑吞吐量和扩展性一样,并发工作站 GC 也以内存为代价优先考虑响应速度。 若要针对内存进行优化,请在使用工作站 GC 时禁用并发垃圾回收。

启用 gcTrimCommitOnLowMemory 设置

由于 GC 保留内存以供将来分配,因此它提交的空间可能会超过真正所需。 在系统内存负荷较重的情况下,可以减少这一空间。 如果启用此设置,GC 会计算系统内存负载,并在负载达到 90% 时进入修整模式。 除非负载下降到不到 85%,否则会一直处于修整模式。 如果条件允许,GC 可以决定此设置对应用没有帮助并忽略它。

配置 GC 设置

  1. 导航到 %windir%\Microsoft.NET\Framework\{version} 目录。

  2. 打开 aspnet.config 文件,找到 <gcServer> 元素。 如果该元素不存在,请使用步骤 3 创建一个条目。

    ...

    <configuration> 
    <runtime> 
    <gcServer enabled="true"/> 
    </runtime> 
    </configuration>
    ...
    
  3. <runtime> 部分中添加以下三个元素:

    ...

    <configuration> 
    <runtime> 
    <gcServer enabled="false" />
    
    <gcConcurrent enabled="false" />
    <gcTrimCommitOnLowMemory enabled="true" />
    </runtime> 
    </configuration>
    ...
    
  4. 保存文件并将其关闭。