WebAPI CORS 和静态文件

Posted

技术标签:

【中文标题】WebAPI CORS 和静态文件【英文标题】:WebAPI CORS and static files 【发布时间】:2014-07-30 16:02:14 【问题描述】:

我有一个 WebApi,它启用了 CORS 并且运行良好。

我想添加由 API 提供的静态文件,以补充实际的 WebAPI 方法。

如果您直接访问静态文件,它们就可以很好地提供,但是如果我尝试将它们 ajax 到另一个域中,我会遇到 CORS 问题。

有问题的实际文件是一个静态 .html 文件。

我真的不想创建一个包装器控制器来提供静态文件,因为如果我动态地这样做会带来一堆安全问题。

我目前正在使用自定义 DelegatingHandler(不是 WebAPI2 内置方式)进行 CORS,但不会为静态文件调用此处理程序。

如何在 WebAPI 中拦截静态文件请求并在适用的情况下应用相关的 CORS 标头?

【问题讨论】:

您提供的文件的content-type 是什么?您是如何处理的? 也许 web.config 对你有用? enable-cors.org/server_iis7.html : <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> @AlexeiLevenkov 看起来可以工作,但我们不想向所有人开放,我们有一个允许客户的动态列表。有什么方法可以从代码中设置吗? @Dalorzo 我想内容类型是 text/html ?它是一个静态文件,所以我认为 IIS 根据扩展名动态定义它 据我所知,您无法在 web.config 中真正指定此属性的动态值,也无法使用代码更改静态文件响应,除非您强制所有请求由 ASP 处理。网。 【参考方案1】:

假设您使用 IAppBuilder.UseFileServer(...)FileServerOptions 来提供静态文件,您可以在此处添加 CORS 标头。

var options = new FileServerOptions
  
  ...           
  StaticFileOptions =
  
    OnPrepareResponse = AddCorsHeader
  ,
  ...
;

您的处理程序可以只是(例如):

private static void AddCorsHeader(StaticFileResponseContext obj)

  obj.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";

它非常广泛,但对我来说效果很好。

【讨论】:

以上是关于WebAPI CORS 和静态文件的主要内容,如果未能解决你的问题,请参考以下文章

尝试访问管理字体文件时,Django 在 AWS S3 中托管静态文件导致 CORS 错误

WebApi 应用程序:错误 404.0,处理程序静态文件

CORS 不允许在 apache2 服务器上提供静态文件

Laravel:为静态文件添加 Cors 标头

如何在 IIS 中提供静态文件(用于 CORS / OPTION 请求)?

加载 Django runserver 提供的静态文件时如何修复 cors 错误