ASP.NET / IIS6:如何搜索服务器的MIME映射?
我想从代码隐藏文件中为IIS ASP.NET Web服务器上的给定文件扩展名找到MIME类型。
我想搜索服务器本身在提供文件时使用的相同列表。 这意味着任何MIME类型的网络服务器管理员已经添加到MIME地图将包括在内。
我可以盲目使用
HKEY_CLASSES_ROOTMIMEDatabaseContent Type
但是这并没有被记录为IIS使用的相同列表,也没有记录Mime地图的存储位置。
我可以盲目地调用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实例显示到控制台。
链接地址: http://www.djcxy.com/p/8217.html上一篇: ASP.NET/IIS6: How to search the server's mime map?
下一篇: Using .NET, how can you find the mime type of a file based on the file signature not the extension