在ASP.NET 5 MVC 6中提供静态文件服务

4
我的wwwroot静态文件无法解析。
我知道为了提供静态文件,我需要将它们放在wwwroot中:

wwwroot static files

favicon.ico 可以正常解析,但是 schema/v1-0.json 无法解析。我收到了通用的消息:

您要查找的资源已被删除、更改名称或暂时不可用。

我在 Startup 中进行了以下连接:

app.UseMiddleware<StaticFileMiddleware>(new StaticFileOptions());
app.UseStaticFiles();

我正在使用DNX beta6。上述内容需要beta5包。我在网上找不到任何关于在beta6中提供静态文件的信息。我不确定这是否可能是问题的原因。
编辑:
根据Sirwan的答案,我已经添加了以下内容,但json文件仍然无法使用:
var options = new StaticFileOptions
{
    ContentTypeProvider =  new JsonContentTypeProvider(),
    ServeUnknownFileTypes = true,
    DefaultContentType = "application/json"
};

app.UseStaticFiles(options);

JsonContentTypeProvider类:

public class JsonContentTypeProvider : FileExtensionContentTypeProvider
{
    public JsonContentTypeProvider()
    {
        Mappings.Add(".json", "application/json");
    }
}

当浏览服务器时,我甚至可以看到文件:

enter image description here


我的记忆有些模糊,但我相信IIS或ASP.NET MVC会通过文件扩展名过滤允许的静态文件。例如,如果您在该位置添加一个.png文件,则可能可以完美地访问它。您需要找到web.config或ASP.NET设置以指定允许的静态文件扩展名,并将.json添加到其中。 - Zain Rizvi
2个回答

5

试试这个:

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true,
    DefaultContentType = "image/x-icon"
});

如果你有多个 ASP.NET 不支持的文件类型,你可以使用 FileExtensionContentTypeProvider 类:
var provider = new FileExtensionContentTypeProvider();
provider.Mappings.Add(".json", "application/json");
provider.Mappings.Add(".ico", "image/x-icon");
// Serve static files.
app.UseStaticFiles(new StaticFileOptions { ContentTypeProvider = provider });

这不会服务于所有静态文件吗?我如何只允许JSON? - Dave New
如果您有多个在ASP.NET中未知的文件类型,您可以使用FileExtensionContentTypeProvider类。 - Sirwan Afifi
@davenewza 我已经更新了我的答案,希望能对你有所帮助。 - Sirwan Afifi
仍然是同样的问题。请查看我的编辑 - 谢谢! - Dave New
添加一个内容类型提供程序解决了我的问题。我不需要将ServeUnknownFileTypes设置为true(我正在使用webapi 2.2)。谢谢。 - Sam

3

如果使用IIS,请确保已添加正确的MIME类型映射,如果没有捕获所有管理处理程序。即使您的网站不需要web.config也能正常工作,但IIS仍将使用它。

如果未配置IIS使用管理处理程序来提供静态文件,则仍将默认使用StaticFileModule,并且调用app.UseStaticFiles实际上不会有任何效果。然而,如果使用dnx运行,则会使用app.UseStaticFiles

顺便说一句,如果您还没有升级到beta7,则应该进行升级。


我认为IIS正在妨碍。当我在IIS Express中托管时请求任何CSS文件,我会自动获得gzip压缩。但是如果我使用WebListener进行托管,则不会出现这种行为。这意味着该请求甚至没有到达我们的任何中间件。如果我错了,请纠正我。 - mbudnik
我认为它不会“妨碍”你。如果你想让ASP.NET 5处理静态文件而不是IIS,你只需要正确配置它即可。 - Dealdiane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接