以编程方式修改脚本映射/处理程序映射

时间:2011-03-22 20:21:35

标签: c# vb.net iis iis-7 iis-6

我有一些代码以编程方式创建虚拟目录。

我需要编辑框架2.0的处理程序映射以使用.net 4.0(基本上在.net 4.0 CLR下运行.net 2.0代码)。

以下代码在win 2003服务器下运行正常,但在Windows 2008服务器webservicefactoryHandler2.0上重命名为webservicefactoryHandler4.032_1245

我不知道如何访问/编辑此名称或实际上保留名称,只是将其值从\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll更改为\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

Dim scriptMapVals As PropertyValueCollection = VDir.Properties("ScriptMaps")
Dim objScriptMaps As ArrayList = New ArrayList()
Dim frameworkVersion As String = "4.0.30319"
Dim versionRegex As Text.RegularExpressions.Regex = New Text.RegularExpressions.Regex("(?<=\\v)\d{1}\.\d{1}\.\d{1,5}(?=\\)")
''Assuming the version will always be something like n.n.nnnnn

Dim scriptMapVal As String
For Each scriptMapVal In scriptMapVals
  If scriptMapVal.Contains("Framework") AndAlso scriptMapVal.Contains("asmx") Then
      objScriptMaps.Add(Text.RegularExpressions.Regex.Replace(scriptMapVal, versionRegex.ToString, frameworkVersion))
  Else
      objScriptMaps.Add(scriptMapVal)
  End If
Next

VDir.Properties("ScriptMaps").Value = objScriptMaps.ToArray()
VDir.CommitChanges()

更新: @kev:所以基本上你是说对不同版本的IIS使用不同的代码吧?好吧,在使用导入“Microsoft.Web.Administration.dll”时,我是否需要将其打包在我的构建中?或者这是所有IIS7.0可安装程序的一部分?因为有些人可能在Windows XP上拥有IIS7.0。

由于 高卢

1 个答案:

答案 0 :(得分:0)

首先,不要使用IIS6兼容性API来操作IIS7处理程序映射。请改用Microsoft.Web.Administration托管API。

然而,你完全以错误的方式解决这个问题。您不应该触及处理程序映射,而是更改应用程序所在的应用程序池的托管运行时版本。

添加对:

的引用
  

C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll

然后在你的代码中:

using Microsoft.Web.Administration;    
...

using (ServerManager serverManager = new ServerManager())
{
  ApplicationPool appPool = 
      serverManager.ApplicationPools.Where(a => a.Name.Equals(appPoolName))
      .Single();
  appPool.ManagedRuntimeVersion = "v2.0";
  serverManager.CommitChanges();
}

我还建议不要使用ADSI兼容性API来操作IIS7的配置。学会爱和拥抱<applicationHost>,忘记在IIS7中思考元数据库对象:

  

http://www.iis.net/ConfigReference/system.applicationHost

<强>更新

除了关于拥有适用于IIS6和IIS7的代码的问题之外,我还是建议 NOT 使用IIS6兼容层,以便只维护一个代码库。

原因是IIS7对象的功能(如HandlerMappings(相当于脚本映射))的处理方式不同。兼容性垫片创建了所谓的ABO自定义地图对象,这些对象失去了正确的HandlerMappings的一些好处。虽然他们工作,但从长远来看,他们会制造行政噩梦。相信我,我去过那里。

如果您需要检测正在运行的IIS版本,那么这里有一个方便的功能:

public static int GetIIsMajorVersion()
{
  string regKey = @"SOFTWARE\Microsoft\InetStp";
  using(RegistryKey key = Registry.LocalMachine.OpenSubKey(regKey, true))
  {
    return Convert.ToInt32(key.GetValue("MajorVersion"));
  }
}

如果返回值为6则为IIS6,如果为7则为IIS 7.x.