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

How do I allow an MIME extension map in ASP.NET vNext?

背景

我有一段 LESS 代码需要在运行时用 Less.js 编译——它通过 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 文件的配置?我是否仍然可以在 vNext 中使用 web.config 文件,或者我是否需要使用 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 class 没有类似于 UseStaticFiles 的方法——它只有 IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware).

的签名

我感觉这可能是解决问题的正确途径——我只是不知道如何正确配置 IAppliationBuilder 以映射 MIME 扩展名。

好的,我想我明白了。

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

在ASP.NETvNext中,这是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 不再出现错误。

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

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

在 .NET Core 1.0.1 中,SeanKileen 的回答还是不错的。以下是简单的代码改写:

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
    });

以上代码扩展了默认映射列表 (see the source),它已经有 ~370 个映射。

如果您想要那些 370 个默认映射,请避免使用采用字典的 FileExtensionContentTypeProvider 构造函数重载(如 JHo 所建议的那样)。