6

IISサーバーに認識されているMIMEタイプのリストを取得しようとしています(2年前に私が尋ねて回答したことがわかります)。コピペした回答には次のものが含まれます。

GetObject("IIS://LocalHost/MimeMap") msdn

GetObject("IIS://localhost/mimemap") KB246068

GetObject("IIS://localhost/MimeMap") スコット・ハンセルマンのブログ

new DirectoryEntry("IIS://Localhost/MimeMap")) スタックオーバーフロー

new DirectoryEntry("IIS://Localhost/MimeMap")) スタックオーバーフロー

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap") 速度レビュー


あなたはアイデアを得る。魔法のパスiis://localhost/mimemapを使用することに誰もが同意します。そして、これは、そうでない場合を除いて、うまく機能します。

失敗する理由について私が見つけることができる唯一の手がかりは、IIS MVP、Chris Crowe のブログからのものです。

string ServerName = "LocalHost";
string MetabasePath = "IIS://" + ServerName + "/MimeMap";
    // Note: This could also be something like
    // string MetabasePath = "IIS://" + ServerName + "/w3svc/1/root";

DirectoryEntry MimeMap = new DirectoryEntry(MetabasePath);

ここには 2 つの手がかりがあります。

  1. 彼はMetabase Pathiis://localhost/mimemapと呼んでいます。「メタベース」へのある種の「パス」のように思えます。
  2. 彼は、メタベースへのパスは別のものである可能性があると述べています。そして彼はそれがどのようなものであるかの例を挙げています.

現在、私と地球全体が、「MetabasePath」を次のようにハードコーディングしています。

iis://localhost/MimeMap

それは本当にどうあるべきですか?有効な MetabasePath を構築するには、コードで何を行う必要がありますか?


注: アクセス拒否エラーは発生しません。無効な MetabasePath がある場合、エラーは同じです。iis://localhost/SoTiredOfThis

4

2 に答える 2

6

ローカル マシンの IIS 構成で作業している場合、つまりコードと IIS が同じボックスにある場合は、次のように指定するだけで十分です。

IIS://Localhost/mimemap

このIIS:部分は、OLE 用語ではモニカーとも呼ばれます。

IIS6 メタベース ファイル ( C:\Windows\System32\inetsrv\metabase.xml) を開くと、XML の大きな「塊」が見つかります。これは実際には平坦化されたツリー構造です。

メタベース内のパスは、属性によって表されLocationます。

モニカは、事実上ツリー ルートであるパスにIIS://localhostマップされます。Location/LM

モニカはpathIIS://localhost/MimeMapにマップされます。Location/LM/MimeMap

コードがリモート マシン上のメタベースにアクセスしている場合は、 を指定する代わりに、 を指定IIS://localhost/[path]しますIIS://[RemoteMachineName]/[path]。これが Chris Crowes のコメントの意味です。

IIS://localhost/MimeMapマスター Mime Type リストでもあります。すべてのサイトがこのリストを継承します (IIS メタベースは、継承されたプロパティに大きく依存しています)。

特定のサイトの MIME タイプをオーバーライドする場合は、次のように変更します。

IIS://localhost/W3SVC/[iisnumber]/ROOT/MimeMap

IIS メタベース ファイルを開いて、ボンネットの下で何が起こっているかを理解するのに役立ちます。

アップデート:

DirectoryEntryパスが無効なオブジェクトを作成できる理由についての質問に答えるにDirectoryEntryは、IIS、LDAP、WinNT などのさまざまな種類の ADSI プロバイダーに対してバインドするために使用される汎用ラッパー オブジェクトです。DirectoryEntry指定されたパスに一致するオブジェクトが必ずしも存在しない可能性があるオブジェクトの作成を許可します。一部の ADSI プロバイダー操作では、この機能が必要になる場合があります。

オブジェクトの存在をテストするために使用できる、DirectoryEntry呼び出された静的メソッドがあります。Exists例えば:

// Does Default Website exist?
if(DirectoryEntry.Exists("IIS://localhost/w3svc/1"))
{
  // Do work...
}
于 2010-04-27T17:11:28.220 に答える
0

これを実行しようとすると、0x80005000が返されるという問題が発生していました。私の問題の愚かな原因は、IIS7を使用していて、IIS6メタベース互換性サポートをインストールしていなかったことです。

于 2012-03-15T10:53:10.447 に答える