如何获取ASP.NET C#中请求的文件的MIME类型?

我想根据MIME类型处理不同的请求。 例如,我有PDF,图像和其他媒体文件,我想根据各自的MIME类型禁止访问。 关于如何做到这一点的任何想法? 谢谢您的帮助。

我还应该注意,访问Windows注册表不是我的应用程序的选项。

.NET的mime类型映射存储在System.Web.MimeMapping类中,该类提供GetMimeMapping方法。

在.NET 4.5之前,此类已标记为internal ,因此您的代码无法使用。 在这种情况下,您可以做的最好的事情是窃取列表,您可以使用Reflector并反编译静态构造函数(cctor)。

如果采用这种方法,最好只创建一个受支持的扩展名列表及其mime类型并将其存储在字典中。 (MimeMapping中的列表有点冗长)

几个月前我遇到了类似的问题,用System.Web.MimeMapping这个简单的包装器解决了它(如Richard Szalay所说):

 ///  /// This class allows access to the internal MimeMapping-Class in System.Web ///  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); } ///  /// Returns a MIME type depending on the passed files extension ///  /// File to get a MIME type for /// MIME type according to the files extension public static string GetMimeMapping(string fileName) { return (string)getMimeMappingMethod.Invoke(null, new[] { fileName }); } } 

交叉发布为什么reflection搜索突然找不到任何东西?

好消息是MimeMapping类及其GetMimeMapping方法看起来好像可以在.NET 4.5中公开。

但是,这意味着上述答案中给出的代码会中断,因为GetMimeMappingNonPublic方法中搜索GetMimeMapping

为确保与.NET 4.5的兼容性(但保留.NET 4.0及更早版本中的function),请更改…

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

…至:

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

此信息位于注册表中, HKEY_CLASSES_ROOT\\Content Type

 using(var key = Registry.ClassesRoot.OpenSubKey(".htm")) { string mimeType = key.GetValue("Content Type") as string; } 

如果我正确理解您的问题,您正在提供静态文件,并希望能够对静态文件请求进行处理,以确定用户是否有权访问该文件。 (基于MIME类型)

如果您通过自定义IHttpHandler映射所有文件请求(请参阅web.config文件的处理程序部分),您应该能够完成此任务。

在ProcessRequest(或BeginProcessRequest,如果你实现了一个异步处理程序),你可以调用HttpContext.Current.Server.MapPath(“〜”+ HttpContext.Current.Request.Path)(可能是一个更好的方法)来获取当前请求静态文件。

然后,您可以分析该文件的扩展名以做出决定。

不确定那是不是你想要的,但希望它有所帮助