我想从给定的扩展程序中获得MIME内容类型(最好是不访问物理文件)。我已经看到了一些有关此问题的问题,并且可以恢复所述执行此操作的方法:
- 使用注册表信息。
- 使用urlmon.dll的findmimefromdata。
- 使用IIS信息。
- 滚动自己的哑剧映射功能。基于这个表, 例如。
我已经使用了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
直接地。