我希望可以根据MIME类型不同来处理请求。例如,我有PDF文件、图像和其他媒体文件,我想根据它们各自的MIME类型禁止访问。你有什么好的建议吗?感谢您的帮助。
另外,我应该注意到,访问Windows注册表对于我的应用程序不是一种选择。
另外,我应该注意到,访问Windows注册表对于我的应用程序不是一种选择。
.NET 的 MIME 类型映射存储在 System.Web.MimeMapping
类中,该类提供 GetMimeMapping 方法。
在 .NET 4.5 之前,这个类被标记为 internal
,因此不可用于你的代码。在这种情况下,你最好偷取这个列表,可以使用 Reflector 并反编译静态构造函数 (cctor)。
如果采用这种方法,你可以更好地创建一个支持的扩展名及其 MIME 类型列表,并将其存储在字典中。(MimeMapping 中的列表有点冗长)
GetMimeMapping(string fileName)
方法。- http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping.aspx - Snixtor几个月前,我遇到了类似的问题,并通过使用 System.Web.MimeMapping 中提到的这个简单的包装类来解决它(由 Richard Szalay 提供):
/// <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 });
}
}
Assembly.GetAssembly(typeof(System.Web.HttpApplication))
。只要方法和引用的类型不改变或消失,那就可以这样做...? - Nelson Rothermel从为什么反射突然找不到任何东西?交叉发布
好消息是,MimeMapping
类及其GetMimeMapping
方法在.NET 4.5中似乎已公开。
但是,这意味着上面的答案中给出的代码将会失效,因为它只在NonPublic
方法中搜索GetMimeMapping
。
为确保与.NET 4.5兼容(但保留.NET 4.0及更早版本的功能),请更改...
getMimeMappingMethod = t.GetMethod("GetMimeMapping",
BindingFlags.Static | BindingFlags.NonPublic);
…to:
getMimeMappingMethod = t.GetMethod("GetMimeMapping",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
这个信息保存在注册表中,在 HKEY_CLASSES_ROOT\<file_extension>\Content Type
中。
using(var key = Registry.ClassesRoot.OpenSubKey(".htm"))
{
string mimeType = key.GetValue("Content Type") as string;
}