ASP.NET将CORS标头添加到ashx文件处理程序

时间:2017-06-07 16:13:42

标签: .net asp.net-mvc c#-4.0 cors asp.net-web-api2

我有一个使用WebApi的C#.NET MVC解决方案。 现在我已经设置了Owin和CORS(用于基于令牌的身份验证),所有这些都按预期工作。

我还有一个文件处理程序:配置了File.ashx,处理程序在本地完美运行。 问题是,当我从另一个Origin(通过AJAX客户端调用)向处理程序发送请求时,我得到了以下错误:

XMLHttpRequest无法加载http://localhost:1234/Handlers/File.ashx。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost:1234”访问。响应的HTTP状态代码为405。

现在,当浏览器发送OPTIONS请求时,很明显访问控制标头不会返回给客户端。

我看了下面的链接: Header not being set for OPTIONS Ajax request表示我通过处理程序本身返回适当的标题。

但是在调试时我注意到ProcessRequest方法甚至没有被击中。

if (context.Request.HttpMethod == "OPTIONS")
    {
        context.Response.AddHeader("Access-Control-Allow-Origin", "*");
        context.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        context.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
    }

我的问题是我在哪里控制/拦截OPTIONS请求并返回相应的标题?

请注意,我只想在WebApi(已经有效)和我的文件处理程序上安装CORS。

2 个答案:

答案 0 :(得分:2)

对于想知道如何解决这个问题的人:

在Global.asax.cs构造函数中为BeginRequest添加一个事件处理程序,并根据您的请求操作响应头。

答案 1 :(得分:1)

我还发现,如果您从Visual Studio运行项目并进行调试,则需要以管理员身份启动Visual Studio。

您应该确保使用ProcessRequest方法

1)

     context.Response.AddHeader("Access-Control-Allow-Origin", "*");
     context.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
     context.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");

2)  web.config档案