There's a non-public method that .NET uses under the hood to do this. I have devised a way to steal the functionality and make it public:
/// <summary>
/// Exposes the Mime Mapping method that Microsoft hid from us.
/// </summary>
public static class MimeMappingStealer
{
// The get mime mapping method
private static readonly Func<string, string> _getMimeMappingMethod = null;
/// <summary>
/// Static constructor sets up reflection.
/// </summary>
static MimeMappingStealer()
{
// Load hidden mime mapping class and method from System.Web
var assembly = Assembly.GetAssembly(typeof(HttpApplication));
Type mimeMappingType = assembly.GetType("System.Web.MimeMapping");
_getMimeMappingMethod = (Func<string, string>)Delegate.CreateDelegate(typeof(Func<string, string>), mimeMappingType.GetMethod("GetMimeMapping",
BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.FlattenHierarchy));
}
/// <summary>
/// Exposes the hidden Mime mapping method.
/// </summary>
/// <param name="fileName">The file name.</param>
/// <returns>The mime mapping.</returns>
public static string GetMimeMapping(string fileName)
{
return _getMimeMappingMethod(fileName);
}
}
To use:
var fileName1 = "whatever.js";
var fileName2 = "somefile.css";
var fileName3 = "myfile.html";
MimeMappingStealer.GetMimeMapping(fileName1) // application/x-javascript
MimeMappingStealer.GetMimeMapping(fileName2) // text/css
MimeMappingStealer.GetMimeMapping(fileName3) // text/html
This code from my blog: http://www.haneycodes.net/a-better-mime-mapping-stealer/