如何在 .NET Core 中为没有文件扩展名的文件设置 MIME 类型?

Posted

技术标签:

【中文标题】如何在 .NET Core 中为没有文件扩展名的文件设置 MIME 类型?【英文标题】:How can I set the MIME type on a file without a file extension in .NET Core? 【发布时间】:2020-05-19 02:13:54 【问题描述】:

我已经获得了一些文件来使用 WebAssembly 模块,这些模块应该设置为作为 application/octet-stream 加载。

我在 Startup.cs 中找到了设置 MIME 类型的文档,并且该文档适用于 WebAssembly 模块本身。

不幸的是,还有其他三个文件应该作为应用程序/八位字节流加载,它们没有文件扩展名,例如file1-shard1。我已经尝试直接使用通配符来解决它们,但它们仍然在 Firefox 的“网络”选项卡中显示为 Type = html

请问有谁知道如何正确设置这些文件的 MIME 类型?

            // Set up FileExtension Content Provider for Web Assembly
            var provider = new FileExtensionContentTypeProvider();
            provider.Mappings[".wasm"] = "application/wasm";
            // Set up MIME type for shard files
            provider.Mappings["file1-shard1"] = "application/octet-stream";
            provider.Mappings["*shard1*"] = "application/octet-stream";
            provider.Mappings[".*"] = "application/octet-stream";
            provider.Mappings["."] = "application/octet-stream";

            app.UseStaticFiles(new StaticFileOptions
            
                ContentTypeProvider = provider
            );

【问题讨论】:

【参考方案1】:

感谢 yaakov 在这方面的领导。除了 DefaultContentType,您还需要告诉应用服务在包含这些文件的文件夹中使用 ServeUnknownFileTypes。

在下面的代码中,app.UseStaticFiles(); 是使 wwwroot 文件夹工作的现有代码。这段代码应该添加到 Startup.cs

然后我为 WebAssembly 文件设置映射。然后将其用于包含默认内容类型和 ServeUnknownFileTypes 的特定文件夹的 app.UseStaticFiles() 的新迭代。

这并不完美,因为存在与 ServeUnknownFileTypes 相关的一些安全风险,但在这种情况下,它仅限于单个文件夹。

// Default options for wwwroot
app.UseStaticFiles();

// Set up FileExtension Content Provider for Web Assembly
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".wasm"] = "application/wasm";

app.UseStaticFiles(new StaticFileOptions

    ContentTypeProvider = provider,
    ServeUnknownFileTypes = true,
    DefaultContentType = "application/octet-stream",
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/WebAssemFiles")),
    RequestPath = "/WebAssemFiles"
);

【讨论】:

【参考方案2】:

您不能使用 FileExtensionContentTypeProvider 执行此操作,因为如果文件没有扩展名,它会在内部失败。

您需要实现自定义IContentTypeProvider,或设置StaticFileOptions.DefaultContentType

【讨论】:

以上是关于如何在 .NET Core 中为没有文件扩展名的文件设置 MIME 类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?

在 Rider 中为 .NET Core 运行 nUnit 测试

如何在 .NET Core 中为 JWT 令牌设计自定义验证器?

如何在 Asp.Net Core 中为日期绑定设置文化?

如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?

如何在 asp.net core 3.1 中为每种类型的请求启用 Cors