mke*_*y33 7 c# asp.net httphandler httpwebrequest
我想根据MIME类型处理不同的请求.例如,我有PDF,图像和其他媒体文件,我想根据各自的MIME类型禁止访问.关于如何做到这一点的任何想法?谢谢您的帮助.
我还应该注意,访问Windows注册表不是我的应用程序的选项.
Ric*_*lay 11
.NET的mime类型映射存储在System.Web.MimeMapping提供GetMimeMapping方法的类中.
在.NET 4.5之前,此类已标记为internal,因此您的代码无法使用.在这种情况下,您可以做的最好的事情是窃取列表,您可以使用Reflector并反编译静态构造函数(cctor).
如果采用这种方法,您可能最好只创建一个受支持的扩展名列表及其mime类型并将其存储在字典中.(MimeMapping中的列表有点冗长)
几个月前我遇到了类似的问题,并使用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 });
}
}
Run Code Online (Sandbox Code Playgroud)
好消息是MimeMapping类和它的GetMimeMapping方法似乎可以在.NET 4.5中公开.
但是,这意味着,在给定的代码上面的回答将打破,因为它是唯一的搜索GetMimeMapping中NonPublic的方法.
为确保与.NET 4.5的兼容性(但保留.NET 4.0及更早版本中的功能),请更改...
getMimeMappingMethod = t.GetMethod("GetMimeMapping",
BindingFlags.Static | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)
…至:
getMimeMappingMethod = t.GetMethod("GetMimeMapping",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
Run Code Online (Sandbox Code Playgroud)