我想从给定的扩展程序中获得MIME内容类型(最好是不访问物理文件)。我已经看到了一些有关此问题的问题,并且可以恢复所述执行此操作的方法:

  1. 使用注册表信息
  2. 使用urlmon.dll的findmimefromdata
  3. 使用IIS信息
  4. 滚动自己的哑剧映射功能。基于这个表, 例如。

我已经使用了1号,但我意识到注册表提供的信息不一致,并且取决于安装在计算机上的软件。某些扩展名,例如.zip不使用内容类型。

解决方案2迫使我将文件放在磁盘上以读取第一个字节,这是缓慢的,但可能会获得良好的结果。

第三种方法是基于目录服务和所有这些内容,这是我不太喜欢的,因为我必须添加com参考,并且我不确定IIS6和IIS7之间是否一致。另外,我不知道这种方法的性能。

最后,我不想使用自己的桌子,但是最后,如果我想要平台之间的结果(甚至是单声道)之间的结果,似乎是最好的选择。

您认为比使用我自己的表或其他描述的方法更好的选择更好吗?您的经验是什么?

答案

这取决于您需要的MIME类型。通常,对于服务(Web Apps,Web服务等),建议不要使用取决于OS设置的MIME列表,或者如果您找不到MIME信息,则只能作为后备。

我认为这也是女士选择将持续哑光类型放入他们的原因的原因System.Web.MimeMapping班级(不幸的是,无论出于何种原因,它都是内部的)。

编辑:

包装器(<= .net 3.5)

public static class MimeExtensionHelper
{
    static object locker = new object();
    static object mimeMapping;
    static MethodInfo getMimeMappingMethodInfo;

    static MimeExtensionHelper()
    {
        Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
        if (mimeMappingType == null)
            throw new SystemException("Couldnt find MimeMapping type");
        ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
        if (constructorInfo == null)
            throw new SystemException("Couldnt find default constructor for MimeMapping");
        mimeMapping = constructorInfo.Invoke(null);
        if (mimeMapping == null)
            throw new SystemException("Couldnt find MimeMapping");
        getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
        if (getMimeMappingMethodInfo == null)
            throw new SystemException("Couldnt find GetMimeMapping method");
        if (getMimeMappingMethodInfo.ReturnType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid return type");
        if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
            throw new SystemException("GetMimeMapping method has invalid parameters");
    }
    public static string GetMimeType(string filename)
    {
        lock (locker)
            return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] { filename });
    }
}

包装器(.NET 4.0)

public static class MimeExtensionHelper
    {
        static object locker = new object();
        static object mimeMapping;
        static MethodInfo getMimeMappingMethodInfo;

        static MimeExtensionHelper()
        {
            Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
            if (mimeMappingType == null)
                throw new SystemException("Couldnt find MimeMapping type");            
            getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
            if (getMimeMappingMethodInfo == null)
                throw new SystemException("Couldnt find GetMimeMapping method");
            if (getMimeMappingMethodInfo.ReturnType != typeof(string))
                throw new SystemException("GetMimeMapping method has invalid return type");
            if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
                throw new SystemException("GetMimeMapping method has invalid parameters");
        }
        public static string GetMimeType(string filename)
        {
            lock (locker)
                return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] { filename });
        }
    }

.NET 4.5+

不需要包装器,请致电公共方法System.Web.MimeMapping.GetMimeMapping直接地。

来自: stackoverflow.com