我有一些代码以编程方式创建虚拟目录。
我需要编辑框架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。
由于 高卢
答案 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中思考元数据库对象:
<强>更新强>
除了关于拥有适用于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.