Как получить MIME-тип файла, запрашиваемого в ASP.NET C #? - PullRequest
6 голосов
/ 19 августа 2009

Я хотел бы обрабатывать запросы по-разному в зависимости от типа MIME. Например, у меня есть PDF-файлы, изображения и другие медиа-файлы, доступ к которым я хотел бы запретить на основе их соответствующих типов MIME. Есть идеи, как это сделать? Спасибо за помощь.

Следует также отметить, что доступ к реестру Windows не подходит для моего приложения.

Ответы [ 5 ]

10 голосов
/ 20 августа 2009

Отображения MIME-типа хранятся в классе System.Web.MimeMapping, который предлагает метод GetMimeMapping .

До .NET 4.5 этот класс был помечен как internal и, следовательно, недоступен для вашего кода. В этом случае лучшее, что вы можете сделать, это украсть список, который вы можете получить с помощью Reflector, и декомпилировать статический конструктор (cctor).

Если вы воспользуетесь этим подходом, вам может быть лучше просто создать список поддерживаемых расширений и их тип MIME и сохранить его в словаре. (Список внутри MimeMapping немного подробный)

9 голосов
/ 31 августа 2009

У меня была похожая проблема несколько месяцев назад, и я решил ее с помощью этого простого класса-обертки вокруг System.Web.MimeMapping (как упомянул Ричард Сзалай):

/// <summary>
/// This class allows access to the internal MimeMapping-Class in System.Web
/// </summary>
class MimeMappingWrapper
{
    static MethodInfo getMimeMappingMethod;

    static MimeMappingWrapper() {
        // dirty trick - Assembly.LoadWIthPartialName has been deprecated
        Assembly ass = Assembly.LoadWithPartialName("System.Web");
        Type t = ass.GetType("System.Web.MimeMapping");

        getMimeMappingMethod = t.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
    }

    /// <summary>
    /// Returns a MIME type depending on the passed files extension
    /// </summary>
    /// <param name="fileName">File to get a MIME type for</param>
    /// <returns>MIME type according to the files extension</returns>
    public static string GetMimeMapping(string fileName) {
        return (string)getMimeMappingMethod.Invoke(null, new[] { fileName });
    }
}
8 голосов
/ 05 февраля 2012

Перекрестная публикация с Почему поиск Reflection вдруг ничего не нашел?

Хорошей новостью является то, что класс MimeMapping и его метод GetMimeMapping выглядят так, как будто они могут быть опубликованы в .NET 4.5.

Однако это означает, что код, указанный в ответе выше , сломается, поскольку он ищет только GetMimeMapping среди NonPublic методов.

Чтобы обеспечить совместимость с .NET 4.5 (но сохранить функциональность в .NET 4.0 и более ранних версиях), измените…

getMimeMappingMethod = t.GetMethod("GetMimeMapping", 
    BindingFlags.Static | BindingFlags.NonPublic);

... для:

getMimeMappingMethod = t.GetMethod("GetMimeMapping",
    BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
1 голос
/ 20 августа 2009

Эта информация в реестре, в HKEY_CLASSES_ROOT\<file_extension>\Content Type

using(var key = Registry.ClassesRoot.OpenSubKey(".htm"))
{
    string mimeType = key.GetValue("Content Type") as string;
}
0 голосов
/ 20 августа 2009

Если я правильно понимаю ваш вопрос, вы обслуживаете статические файлы и хотите, чтобы у вас была возможность обработать запрос статического файла, чтобы определить, имеет ли пользователь доступ к этому файлу. (на основе типа MIME)

Если вы отобразите все запросы к файлам через пользовательский IHttpHandler (см. Раздел обработчиков вашего файла web.config), вы сможете выполнить это.

В ProcessRequest (или BeginProcessRequest, если вы реализуете асинхронный обработчик), вы можете вызвать HttpContext.Current.Server.MapPath ("~" + HttpContext.Current.Request.Path) (может быть, лучший способ сделать это) для получить текущий запрашиваемый статический файл.

Затем вы можете проанализировать расширение этого файла, чтобы принять решение.

Не уверен, что это то, что вы хотите, но, надеюсь, это поможет

...