站点的应用程序 <application>

概述

<application> 元素控制特定应用程序的配置设置。 Internet Information Services (IIS) 7 或更高版本中的应用程序是一组文件的集合,这些文件通过诸如 HTTP 之类的协议提供内容或服务。 在 IIS 7 中创建应用程序时,应用程序的路径将成为站点 URL 的一部分。

在 IIS 7 及更高版本中,每个站点必须至少有一个应用程序,称为根应用程序或默认应用程序。 但是,站点可以有多个应用程序。 例如,你的在线商业网站可能包含多个应用程序,例如购物车应用程序(允许用户在购物期间收集物品),以及登录应用程序(允许用户在购买时重新调出保存的付款信息)。

应用程序必须至少包含一个虚拟目录,称为根目录或默认虚拟目录,并在 <virtualDirectory> 元素中定义配置设置。

兼容性

版本 说明
IIS 10.0 <application> 元素在 IIS 10.0 中未进行修改。
IIS 8.5 <application> 元素在 IIS 8.5 中未进行修改。
IIS 8.0 添加了 preloadEnabled 属性,以在收到请求之前启动初始化过程。
IIS 7.5 <application> 元素已更新为包含 serviceAutoStartEnabledserviceAutoStartProvider 属性。
IIS 7.0 <application> 元素是在 IIS 7.0 中引入的。
IIS 6.0 <application> 元素替换了 IIS 6.0 IIsWebVirtualDir 和 IIsWebDirectory 元数据库对象。

安装

<application> 元素包含在 IIS 7 及更高版本的默认安装中。

操作方式

如果创建新的 Web 应用程序

  1. 打开 Internet Information Services (IIS) 管理器:

    • 如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS) 管理器”
    • 如果使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS) 管理器”
    • 如果使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
  2. 在“连接”窗格中,展开服务器名称,展开“站点”,然后单击要在其中添加应用程序的网站。

  3. 在“操作”窗格中,单击“查看应用程序”,然后单击“添加应用程序...”
    Screenshot of Applications pane in I I S Manager with Add Application highlighted in Actions pane.

  4. 在“添加应用程序”对话框中,至少在“别名:”和“物理路径:”文本框中输入信息,然后单击“确定”。
    Screenshot of Add Application dialog box with fields for Alias and Physical path.

    注意

    可以单击“选择”以选择其他应用程序池,单击“连接为”以配置应用程序为接受来自特定帐户的凭据,然后单击“测试设置”以测试应用程序的身份验证和授权设置。

配置

<application> 元素可在 ApplicationHost.config 文件中的服务器级别进行配置。

特性

属性 说明
applicationPool 可选的字符串属性。

指定分配给应用程序的应用程序池。

没有默认值。
enabledProtocols 可选的字符串属性。

指定要通过其与应用程序通信的协议。 此值为应用程序启用 HTTP 和 HTTPS 协议。

默认值为 http
path 必需的字符串属性。

指定应用程序的虚拟路径。 必须是父站点中的唯一路径。

没有默认值。
preloadEnabled 可选布尔属性。

指定 IIS 模拟对应用程序或虚拟目录的默认页面的用户请求,以便对其进行初始化。 实际上,IIS 在启动应用程序池时启动应用程序,而无需收到请求。 这可以通过执行初始化任务(例如加载托管模块和编译托管代码)来提高性能。 IIS 日志中未生成任何日志。 应用程序池的 startMode 设置必须设置为 AlwaysRunning

默认值为 False
serviceAutoStartEnabled 可选布尔属性。

如果为此应用程序启用了自动启动,则为 true,否则为 false

默认值为 false
serviceAutoStartProvider 可选的字符串属性。

指定如果 serviceAutoStartEnabled 设置为 true 时,Windows 进程激活服务 (WAS) 将使用的自动启动提供程序的名称

没有默认值。

子元素

元素 说明
virtualDirectory 可选元素。

指定父应用程序中虚拟目录的配置设置。
virtualDirectoryDefaults 可选元素。

指定父应用程序中所有虚拟目录的默认设置。

配置示例

以下配置示例显示了包含两个应用程序的 <site> 元素。 第一个 <application> 元素定义站点的根应用程序,以及应用程序的根虚拟目录。 第二个 <application> 元素包含网站上的 CRM 应用程序的配置设置。 路径属性定义应用程序的路径。 此 <application> 元素包含两个 <virtualDirectory> 元素。 第一个定义应用程序的根虚拟目录,第二个定义应用程序的 Images 虚拟目录。

<site name="Contoso" id="2" serverAutoStart="true">
   <application path="/">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
   </application>
   <application path="/CRM">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content\CRM" />
      <virtualDirectory path="/Images" physicalPath="E:\Images" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
   </bindings>
</site>

代码示例

以下示例为名为 Contoso 的站点新建了一个名为 ShoppingCart 的应用程序,其虚拟根目录为 C:\Inetpub\Contoso\ShoppingCart。

注意

从命令提示符或从脚本创建应用程序时,必须显式创建应用程序的根虚拟目录。

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart']" /commit:apphost

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart'].[path='/',physicalPath='C:\Inetpub\Contoso\ShoppingCart']" /commit:apphost

注意

使用 AppCmd.exe 配置这些设置时,必须确保将 commit 参数设置为 apphost。 这会将配置设置提交到 ApplicationHost.config 文件中的相应位置部分。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");

         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElementCollection siteCollection = siteElement.GetCollection();
         ConfigurationElement applicationElement = siteCollection.CreateElement("application");

         applicationElement["path"] = @"/ShoppingCart";
         ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();
         ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
         virtualDirectoryElement["path"] = @"/";
         virtualDirectoryElement["physicalPath"] = @"C:\Inetpub\Contoso\ShoppingCart";
         applicationCollection.Add(virtualDirectoryElement);
         siteCollection.Add(applicationElement);

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")

      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim siteCollection As ConfigurationElementCollection = siteElement.GetCollection
      Dim applicationElement As ConfigurationElement = siteCollection.CreateElement("application")
      applicationElement("path") = "/ShoppingCart"
      Dim applicationCollection As ConfigurationElementCollection = applicationElement.GetCollection
      Dim virtualDirectoryElement As ConfigurationElement = applicationCollection.CreateElement("virtualDirectory")
      virtualDirectoryElement("path") = "/"
      virtualDirectoryElement("physicalPath") = "C:\Inetpub\Contoso\ShoppingCart"
      applicationCollection.Add(virtualDirectoryElement)
      siteCollection.Add(applicationElement)

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var siteCollection = siteElement.Collection;
var applicationElement = siteCollection.CreateNewElement("application");
applicationElement.Properties.Item("path").Value = "/ShoppingCart";
var applicationCollection = applicationElement.Collection;
var virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory");
virtualDirectoryElement.Properties.Item("path").Value = "/";
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\\Inetpub\\Contoso\\ShoppingCart";
applicationCollection.AddElement(virtualDirectoryElement);
siteCollection.AddElement(applicationElement);

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))

If (siteElementPos = -1) Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set siteCollection = siteElement.Collection
Set applicationElement = siteCollection.CreateNewElement("application")
applicationElement.Properties.Item("path").Value = "/ShoppingCart"
Set applicationCollection = applicationElement.Collection
Set virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory")
virtualDirectoryElement.Properties.Item("path").Value = "/"
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\Inetpub\Contoso\ShoppingCart"
applicationCollection.AddElement(virtualDirectoryElement)
siteCollection.AddElement(applicationElement)

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function