ASP.NET/IIS6:Как выполнить поиск по mime-карте сервера?
-
05-07-2019 - |
Вопрос
я хочу найти mime-тип для данного расширения файла на веб-сервере IIS ASP.NET из файла с кодом.
я хочу выполнить поиск в том же списке, который использует сам сервер при отправке файла.Это означает, что все типы mime, добавленные администратором веб-сервера в Mime - карта будут включены.
я мог бы слепо использовать
HKEY_CLASSES_ROOT\MIME\Database\Content Type
но это не задокументировано как тот же список, который использует IIS, и не задокументировано, где Mime - карта хранится.
я мог бы слепо позвать Найдите значение из данных, но это не задокументировано как тот же список, который использует IIS, и я не могу гарантировать, что IIS Mime - карта также будет возвращен результат этого вызова.
Решение
Вот один из них, который я сделал ранее:
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;
}
}
Добавьте ссылку на System.DirectoryServices
и ссылку на поставщик пространства имен Active DS IIS
на вкладке COM. Расширение должно иметь начальную точку, то есть .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.