我想从给定的扩展名中获取MIME Content-Type(最好不要访问物理文件) . 我已经看到了一些关于这个的问题,并且描述执行此操作的方法可以恢复:
-
使用IIS information .
-
滚动自己的MIME映射功能 . 例如,基于this table .
我已经使用no.1一段时间但我意识到注册表提供的信息不一致,取决于机器上安装的软件 . 某些扩展名(如.zip)不用于指定Content-Type .
解决方案2迫使我将文件放在磁盘上以便读取第一个字节,这可能很慢,但可能会得到很好的结果 .
第三种方法基于目录服务和所有这些东西,这是我不喜欢的东西,因为我必须添加COM引用,我不确定它在IIS6和IIS7之间是否一致 . 另外,我不知道这种方法的表现 .
最后,我不想使用我自己的表,但最后似乎是最好的选择,如果我想要一个不错的性能和平台之间的结果的一致性(甚至单声道) .
你认为有比使用我自己的表更好的选择或其他一种描述的方法更好吗?你有什么经历?
6 回答
这取决于您需要的MIME类型 . 通常,对于服务(Web应用程序,Web服务等),建议不要使用依赖于操作系统设置的MIME列表,或者如果您无法找到MIME信息,则仅作为后备 .
我认为这也是MS选择在其
System.Web.MimeMapping
类中放置常量MIME类型的原因(不幸的是,无论出于何种原因,它都是内部的) .编辑:
包装器(<= .NET 3.5)
包装器(.NET 4.0)
.NET 4.5+
不需要包装器,直接调用公共方法System.Web.MimeMapping.GetMimeMapping .
我已经在我的实用程序库中结合了所有这些方法,除了可能没有 . Btw,no.2(urlmon.dll)不需要静态文件,无论它们来自何处,它都只需要一些字节 . 这是我目前的课程
}
System.Web.MimeMapping
有3个版本 - 两个版本4.0(其中一个是内部版本),然后版本2.0也是内部版本 . 正如所指出的,在.NET 4.5框架的System.Web版本4.0中有一个类的公共版本 .对于RoadkillWiki,我基本上对它进行了逆向工程以节省每次反映的麻烦,Wiki的文件处理程序默认尝试使用IIS / applicationhost.config,然后进入MimeMapping类:
和MimeMapping:
我编写了一个程序,用于获取Apache mime.types文件并将其转换为由文件扩展名键入的C#
Dictionary<string, string>
. 它在这里:https://github.com/cymen/ApacheMimeTypesToDotNet
实际输出是这个文件:
https://github.com/cymen/ApacheMimeTypesToDotNet/blob/master/ApacheMimeTypes.cs
希望其他人发现它也有用!
Nisus - 你愿意在某个地方发布你的实用程序的完整源代码吗?这真的很有帮助 . 谢谢!
没关系....
我编辑了apache定义文件,只包含具有已定义扩展名的条目,然后扩展代码以在运行时从文本文件加载类型/扩展名 . 也许并不优雅,但肯定会为mime类型创建/维护630行源代码 .
[在MimeTypeCollection的构造函数中而不是这个东西:this.Add(new mimeTypeInfo(“application / applixware”,new list(new [] {“ . aw”})));]
我还发现将调用Init()方法,并且_extensions和_mime成员不会被完全初始化,因此我将其更改为:
无论如何,我现在如何能够处理我需要的外部defs和本地注册表的类 .
谢谢!
我还发现将调用Init()方法并且_extensions和_mime成员不会被完全初始化,因此我将其更改为read,最好的方法是从MimeTypeCollection中删除构造函数中的GetExtension: