Asp.net
ASP.NET/IIS6:如何搜尋伺服器的 MIME 地圖?
我想從程式碼隱藏文件中找到 IIS ASP.NET Web 伺服器上給定文件副檔名的 mime 類型。
我想搜尋伺服器本身在提供文件時使用的相同列表。這意味著將包括 Web 伺服器管理員添加到Mime Map的任何 mime 類型。
我可以盲目使用
HKEY_CLASSES_ROOT\MIME\Database\Content Type但這沒有記錄為 IIS 使用的相同列表,也沒有記錄Mime Map的儲存位置。
我可以盲目地呼叫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";