Asp.net

ASP.NET/IIS6:如何搜尋伺服器的 MIME 地圖?

  • May 27, 2014

我想從程式碼隱藏文件中找到 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";

引用自:https://stackoverflow.com/questions/174888