asp.net核心 - 如何提供没有扩展名的静态文件

时间:2018-02-13 14:40:25

标签: asp.net-core

ASP.NET Core根据文件的mime类型提供wwwroot文件夹中的文件。但是如何让它提供没有扩展名的文件?

例如,Apple要求您在应用/apple-app-site-association中设置一个端点,以便进行某些应用整合。如果您将名为apple-app-site-association的文本文件添加到wwwroot中,则无法正常工作。

我尝试过的一些事情:

1)提供没有扩展名的映射:

var provider = new FileExtensionContentTypeProvider();
provider.Mappings[""] = "text/plain";
app.UseStaticFiles(new StaticFileOptions
            {
                ContentTypeProvider = provider
            });

2)添加应用程序重写:

var options = new RewriteOptions()
.AddRewrite("^apple-app-site-association","/apple-app-site-association.txt", false)

无论是否有效,唯一可行的是.AddRedirect,如果可能的话,我不会使用它。

4 个答案:

答案 0 :(得分:13)

添加替代解决方案。您必须将ServeUnknownFileTypes设置为true,然后设置默认内容类型。

        app.UseStaticFiles(new StaticFileOptions
        {
            ServeUnknownFileTypes = true,
            DefaultContentType = "text/plain"
        });

答案 1 :(得分:6)

我认为你最好只为它创建一个控制器,而不是与静态文件作斗争:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.IO;

namespace MyApp.Controllers {
    [Route("apple-app-site-association")]
    public class AppleController : Controller {
        private IHostingEnvironment _hostingEnvironment;

        public AppleController(IHostingEnvironment environment) {
            _hostingEnvironment = environment;
        }

        [HttpGet]
        public IActionResult Index() {
            return Content(System.IO.File.ReadAllText(Path.Combine(_hostingEnvironment.WebRootPath,"apple-app-site-association")), "text/plain");
        }
    }
}

这假设您的apple-app-site-association文件位于wwwroot文件夹中。

答案 2 :(得分:5)

一个更简单的选择可能是将具有适当扩展名的文件放在服务器上,然后按如下所示使用URL重写。

app.UseRewriter(new RewriteOptions()
    .AddRewrite("(.*)/apple-app-site-association", "$1/apple-app-site-association.json", true));

答案 3 :(得分:3)

我认为最简单的方法是将 apple-app-site-association 文件添加到应用程序根文件夹中的 .well-known 文件夹中,如上所述此处:[https://developer.apple.com/documentation/safariservices/supporting_related_domains] 然后允许从您的代码访问它,如下所示 (Startup.cs):

 // to allow access to apple-app-site-association file
app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, @".well-known")),
    RequestPath = new PathString("/.well-known"),
    DefaultContentType = "application/json",
    ServeUnknownFileTypes = true,
});

在 AWS 无服务器应用程序 (.NET Core 3.1) 中测试