为 ASP .NET MVC 中的静态资源启用 CORS?

Posted

技术标签:

【中文标题】为 ASP .NET MVC 中的静态资源启用 CORS?【英文标题】:Enable CORS for static resources in ASP .NET MVC? 【发布时间】:2014-05-05 12:52:47 【问题描述】:

我找到了大量关于 Web API 中的 CORS 和 ASP .NET MVC 中的通用控制器的资源。

但是,我希望特定文件夹中的所有静态资源(CSS 和 JS 文件)也可以通过 AJAX 下载。换句话说,为那些资源或那个文件夹启用 CORS。

我怎样才能做到这一点?我没有发现类似的问题。它们都与 Web API 或通用控制器有关。

【问题讨论】:

是否可以通过 IIS 为该文件夹设置 Access-Control-Allow-Origin 标头?通过 AJAX 请求可以读取它们的原因是什么(只是想知道这听起来不寻常)? 它可能会 - 如果是这样,我如何为那个确切的文件夹设置该标题?另外,如果可能的话,我希望它不依赖于 IIS,而是依赖于代码。但如果没有其他方法,请分享如何做到这一点。 我想HTTP Module 会起作用。这可以拦截 HTTP 请求并附加标头(因此您可以将其设置为仅适用于来自特定文件夹的请求)。 你能发布一个简单模块的例子来解决这个问题吗?到时候我会把它标记为答案。 请问静态资源开启CORS的原因是什么? 【参考方案1】:

示例改编自Walkthrough: Creating and Registering a Custom HTTP Module。这应该将标头添加到所有 .js.css 请求中。

创建模块

using System;
using System.Web;
public class HelloWorldModule : IHttpModule

    public HelloWorldModule()
    
    

    public String ModuleName
    
        get  return "HelloWorldModule"; 
    

    // In the Init function, register for HttpApplication 
    // events by adding your handlers.
    public void Init(HttpApplication application)
    
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
    

    private void Application_BeginRequest(Object source, 
         EventArgs e)
    
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        string filePath = context.Request.FilePath;
        string fileExtension = 
            VirtualPathUtility.GetExtension(filePath);
        if (fileExtension.Equals(".css") || fileExtension.Equals(".js"))
        
            context.Response.AddHeader("Access-Control-Allow-Origin", "*");
        
    

    public void Dispose()  

为以经典模式运行的 IIS 6.0 和 IIS 7.0 注册模块

<configuration>
  <system.web>
    <httpModules>
      <add name="HelloWorldModule" type="HelloWorldModule"/>
     </httpModules>
  </system.web>
</configuration>

为在集成模式下运行的 IIS 7.0 注册模块

<configuration>
  <system.webServer>
    <modules>
      <add name="HelloWorldModule" type="HelloWorldModule"/>
    </modules>
  </system.webServer>
</configuration>

在运行 MVC 时,请确保更改根目录中的那个(而不是 Views 文件夹)。

【讨论】:

出于好奇,ModuleName 属性是干什么用的?它不是您正在实现的接口的一部分。 @MathiasLykkegaardLorenzen 我认为它在 web.config 中匹配

以上是关于为 ASP .NET MVC 中的静态资源启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net MVC 4 WebApi 中的嵌套资源

asp.net MVC SignalR 与数据库 实时同步显示

如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求

在 ASP.Net 5 / Core 中启用跨域资源共享 (CORS)

EF Core 中的 ASP.NET Core 5 MVC 和 Identity - 基于资源的授权

将静态文件路由到 asp.net mvc 中的新路径