【问题标题】:Enable CORS for static resources in ASP .NET MVC?为 ASP .NET MVC 中的静态资源启用 CORS?
【发布时间】: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的原因是什么?

标签: c# ajax asp.net-mvc 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 中匹配
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多