如何在ASP.NET vNext中允许MIME扩展映射?

时间:2015-02-01 15:49:33

标签: configuration permissions mime-types asp.net-core

背景

我有一段需要在运行时使用Less.js编译的LESS代码 - 它通过JavaScript计算一些东西 - 所以我不能使用任务运行器等。

在我的index.html中,我有:

<head>
   ...
   <link rel="stylesheet/less" href="assets/less/DynamicHeight.less" />
   ...
   <script type="text/javascript" src="lib/less/less.js"></script>
   ... 
</head>

问题

Less.js似乎无法找到该文件:

LESS.js barfing because IIS can't serve the file

当我尝试直接访问该文件时,我看到:

enter image description here

问题

如何添加允许下载较少文件的配置?我仍然能够将web.config个文件与vNext一起使用,还是需要对config.json执行某些操作?

领导1:我应该使用Owin吗?

认为这可能是正确的道路,但我很陌生。

我看到了很多教程,例如K. Scott Allen's,其中引用的代码如下:

    public void Configuration(IAppBuilder app)
    {
        var options = new StaticFileOptions
        {
            ContentTypeProvider = new FileExtensionContentTypeProvider()
        };
        ((FileExtensionContentTypeProvider)options.ContentTypeProvider).Mappings.Add(
            new KeyValuePair<string, string>(".less", "text/css"));
        app.UseStaticFiles(options);
    }

但是,似乎在当前版本中,asp.net正在寻找Configure(IApplicationBuilder app)的签名。

IApplicationBuilder类没有UseStaticFiles的方法 - 它只有IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)的签名。

我觉得这可能是解决问题的正确途径 - 我无法找到如何对IAppliationBuilder进行属性配置以映射MIME扩展。

3 个答案:

答案 0 :(得分:7)

好的,我相信我弄清楚了。

步骤1:为静态文件添加适当的库

在ASP.NET vNext中,这是Microsoft.Aspnet.StaticFiles

project.json文件中,在"dependencies"下添加以下内容:

"Microsoft.AspNet.StaticFiles": "1.0.0-beta2"

这会添加您稍后可以使用的静态中间件方法。

步骤2:配置应用程序以使用静态文件

在顶部添加using语句:

using Microsoft.AspNet.StaticFiles;

此时,app.UseStaticFiles方法可用,因此您的Configure方法可能如下所示:

public void Configure(IApplicationBuilder app)
{
    var options = new StaticFileOptions
    {
        ContentTypeProvider = new FileExtensionContentTypeProvider()
    };
    ((FileExtensionContentTypeProvider)options.ContentTypeProvider).Mappings.Add(
        new KeyValuePair<string, string>(".less", "text/css"));
    app.UseStaticFiles(options);
}

瞧!我在浏览.less文件时得到文本,并且LessJS不再出现错误。

答案 1 :(得分:3)

在.NET Core 1.0.1中,SeanKileen的答案仍然很好。以下是一个简单的代码重写:

        let imageOptionsDictKeys = [kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey,  kCVPixelBufferHeightKey, kCVPixelBufferOpenGLESCompatibilityKey]
        let imageOptionsDictKeysRawPointer = Unmanaged.passUnretained(imageOptionsDictKeys).toOpaque()
        let imageOptionsDictKeysPointer =  UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1)
        imageOptionsDictKeysPointer.initialize(to: imageOptionsDictKeysRawPointer)

        let imageOptionsDictValues = [ cvPixelFormatType,  frameW, frameH, boolYES]
        let imageOptionsDictValuesRawPointer = Unmanaged.passUnretained(imageOptionsDictValues).toOpaque()
        let imageOptionsDictValuesPointer =  UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1)
        imageOptionsDictValuesPointer.initialize(to: imageOptionsDictValuesRawPointer)

        let imageOptions = CFDictionaryCreate(kCFAllocatorDefault, imageOptionsDictKeysPointer, imageOptionsDictValuesPointer, 4, &keyCallbacks, &valueCallbacks)

上面的代码EXTENDS默认映射列表(see the source),它已经有~370个映射。

如果你想要那些370默认映射,请避免使用带有字典的public void Configure(IApplicationBuilder app, ...) var contentTypeProvider = new FileExtensionContentTypeProvider(); contentTypeProvider.Mappings[".map"] = "application/javascript"; contentTypeProvider.Mappings[".less"] = "text/css"; app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = contentTypeProvider }); 构造函数重载(如JHo所建议的那样)。

答案 2 :(得分:-1)

SeanKilleen的答案是正确的,仍然适用于ASP.NET Core RC1。我唯一的改进是使用集合初始化程序编写完全相同的代码,以使其更清晰。

app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary<string, string>
    {
        { ".less", "text/css" },
        { ".babylon", "text/json" },
        // ....
    })
});