ASP.NET/IIS6:サーバーのMIMEマップを検索する方法は?
-
05-07-2019 - |
質問
iは、分離コードファイルからIIS ASP.NET Webサーバー上の特定のファイル拡張子のMIMEタイプを検索したいです。
iは、サーバー自体がファイルを提供するときに使用するのと同じリストを検索したい。これは、Webサーバー管理者が Mime Map に追加したMIMEタイプが含まれることを意味します。
iは盲目的に使用できます
HKEY_CLASSES_ROOT\MIME\Database\Content Type
しかし、IISが使用しているのと同じリストとして文書化されておらず、 MIMEマップが保存されている場所にも文書化されていません。
iは盲目的に FindMimeFromData を呼び出すことができますが、これは、IISが使用するものと同じリストとして文書化されておらず、IIS Mime Map もその呼び出しから返されることを保証することはできません。
解決
これは以前に作成したものです:
public static string GetMimeTypeFromExtension(string extension)
{
using (DirectoryEntry mimeMap =
new DirectoryEntry("IIS://Localhost/MimeMap"))
{
PropertyValueCollection propValues = mimeMap.Properties["MimeMap"];
foreach (object value in propValues)
{
IISOle.IISMimeType mimeType = (IISOle.IISMimeType)value;
if (extension == mimeType.Extension)
{
return mimeType.MimeType;
}
}
return null;
}
}
[COM]タブの下に、 System.DirectoryServices
への参照と Active DS IIS Namespace Provider
への参照を追加します。拡張機能には、先頭にドットを付ける必要があります。つまり、 .flv
です。
他のヒント
別の同様の実装を次に示しますが、COM参照を追加する必要はありません。代わりにリフレクションを介してプロパティを取得し、簡単に検索できるようにNameValueCollectionに保存します。
using System.Collections.Specialized; //NameValueCollection
using System.DirectoryServices; //DirectoryEntry, PropertyValueCollection
using System.Reflection; //BindingFlags
NameValueCollection map = new NameValueCollection();
using (DirectoryEntry entry = new DirectoryEntry("IIS://localhost/MimeMap"))
{
PropertyValueCollection properties = entry.Properties["MimeMap"];
Type t = properties[0].GetType();
foreach (object property in properties)
{
BindingFlags f = BindingFlags.GetProperty;
string ext = t.InvokeMember("Extension", f, null, property, null) as String;
string mime = t.InvokeMember("MimeType", f, null, property, null) as String;
map.Add(ext, mime);
}
}
そのルックアップテーブルを非常に簡単にキャッシュし、後で参照することができます。
Response.ContentType = map[ext] ?? "binary/octet-stream";
IISは、MIME情報を独自のデータベースに保存します。 " MimeMap IIS"の検索インターネット上でそれを読んだり、変更したりする方法を明らかにします。たとえば、 C#-MimeMapエントリをコンソールに表示する方法を参照してください。 IISのインスタンス。