2

ビスタを使って...

ADSI を使用して IIS Web サイトに ScriptMap を設定するスクリプトがあります。これは cscript.exe 内で実行される JavaScript であり、コードは次のようになります。

var web = GetObject("IIS://localhost/W3SVC/1");
var maps = web.ScriptMaps.toArray();
map[maps.length] = ".aaa,c:\\path\\to\\isapi\\extension.dll,1,GET,POST";
web.ScriptMaps = maps.asDictionary();
web.SetInfo();

スクリプトを実行した後に IIS マネージャーを見ると、ハンドラー マッピングのリストに新しいエントリが表示されます。「AboMapperCustom-43155」という奇妙な名前が付いています。これは、ADSI の IIS7 互換レイヤーに由来するものだと理解しています。

次に、IIS マネージャーでこれらのハンドラー マッピングを削除し、別の ADSI スクリプトを実行して ScriptMaps プロパティをクエリすると、スクリプトで取得された ScriptMaps には、削除されたばかりのエントリがリストされたままになります。ADSI スクリプトの結果は、IIS マネージャーに表示される「ハンドラー マッピング」のリストと一致しません。

これは、IISADMIN および W3SVC の開始/停止後も持続します。

これは予想される動作ですか?ADSI は、IIS7 の「互換モード」としてサポートされています。これはその人工物ですか?

ハンドラー マッピングが IIS Manager から削除された場合、ADSI クエリから引き続き返されますが、実際にはなくなると思います。

誰かがこれについて明確にすることができますか?

4

1 に答える 1

2

ADSI 互換性ビットを使用して (引数のために既定の Web サイトを使用して) 'scriptmap' を追加すると、applicationHost.config次の場所にあるサイトのファイルにハンドラー マッピングが追加されます。

<location path="Default Web Site">
  <system.webServer>
    <handlers>
        <add name="AboMapperCustom-12345678" ... />
    </handlers>
  </system>
</location>

IIS7 マネージャーでハンドラー マッピングを削除するapplicationHost.configと、上記のファイルとセクションからマッピングを削除する代わりにweb.config、次のファイルがサイトのルートに追加されます。

<configuration>
  <system.webServer>
    <handlers>
        <remove name="AboMapperCustom-12345678" />
    </handlers>
  </system>
</configuration>

新しいマネージドMicrosoft.Web.Administration.NET API を使用して Web サイトの構成を取得する場合、さまざまなレベルで構成を読み取ることができます。次に例を示します。

1: applicationHost.configAPPHOST レベルで構成を読み取る

ServerManager serverManager = new ServerManager();
var site = serverManager.Sites.Where(s => s.Id == 1).SingleOrDefault();
Configuration siteConfig = serverManager.GetApplicationHostConfiguration();
ConfigurationSection handlersSection = 
     siteConfig.GetSection("system.webServer/handlers", site.Name);
ConfigurationElementCollection handlersCollection = 
     handlersSection.GetCollection();

foreach (var item in handlersCollection)
{
    Console.WriteLine(item.Attributes["name"].Value);
}

上記の例では、マッピングを削除しても、ハンドラー マッピング コレクションを反復するときにリストされます。これは、アプリケーション ホスト レベルで構成を要求したためです。web.configサイトのルート以下に存在するファイルは読み取られず、それらのハンドラーと<add/>ディレクティブ<remove/>は含まれません。

2: サイト (またはサイト内のサブフォルダー) に固有の構成を読み取ることができます。

ServerManager serverManager = new ServerManager();
Configuration siteConfig = serverManager.GetWebConfiguration("Default Web Site");    
ConfigurationSection handlersSection = 
    siteConfig.GetSection("system.webServer/handlers");
ConfigurationElementCollection handlersCollection = 
    handlersSection.GetCollection();

foreach (var item in handlersCollection)
{
    Console.WriteLine(item.Attributes["name"].Value);
}

これにより、サイト ファイルも読み取られ、 で指定されたおよびディレクティブweb.configを説明するハンドラ マッピング リストが返されます。<add/><remove/>web.config

これは、ハンドラー マッピングを表示および変更するときに、IIS7 マネージャー アプリケーションが行っていることです。(必要に応じて)web.configサイトのルート フォルダー (またはサブフォルダー) にファイルを作成し、このレベルで必要なファイルを<add/>追加<remove/>して、ハンドラーを追加および削除します。

IIS6 互換レイヤーは、applicationHost.configAPPHOST レベル (上記のオプション 1) でのみ動作するように見えるため、これらの違いが見られます。

バグですか?web.config最終的にADSIが最初から認識していなかったからかどうかはわかりません。また、MS は新しいメソッドまたはフラグを追加して、これらの「スクリプトマップ」の変更を実際に行うレベルを指定できるようにする必要があります。これは、ADSI コンポーネントを壊してテストすることを意味し、バグが発生する可能性があります。この動作は、古い IIS6 メタベースの変更をシミュレートするために存在し、applicationHost.config実際にはメタベースに似ているため、正しいか間違っているかにかかわらず、正しいことを行っていると主張できます。

于 2010-02-03T02:30:39.657 に答える