将HttpHeader添加到静态文件以解决“脚本错误”

时间:2019-07-15 13:51:51

标签: javascript asp.net-web-api cors signalr

一周来,我一直在试图解决此问题。希望有人能看到我想念的东西。

我有两个项目:localhost:A(Web-Api)托管一个js文件,而localhost:B(.NET MVC)使用该js文件。尝试在js文件中捕获错误并将其发送到localhost:A时,我得到了一条神秘的Script Error消息,而不是实际错误。

谷歌快速搜索告诉我这是一种安全措施,可防止localhost:A收集有关客户端的信息。为了解决这个问题,我需要做两件事:

  1. crossorigin='anonymous'的引用localhost:B添加到js文件中
  2. 将HttpHeader Access-Control-Allow-Origin="*"添加到js文件响应中。

我发现了几种在Web-Api上执行操作的方法,但似乎没有一种有效。

我试图像这样在Web.config文件中添加标题:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
  </customHeaders>
<httpProtocol>

我试图像这样在Global.asax.cs文件中添加标题:

public static void Register(HttpConfiguration config)
{
    var corsAttr = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors(corsAttr);

    config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

我试图像这样在Startup.cs文件中添加标题:

public void Configuration(IAppBuilder app)
{
    //app.UseCors(CorsOptions.AllowAll);<--and here
    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration
        {
            EnableDetailedErrors = true
        };
        map.RunSignalR(hubConfiguration);
    });
}

HTTP和SignalR传输与标头一起发生,但是正在提取的文件缺少标头。

我想念什么?

编辑:这是当前“请求和响应”标头的屏幕截图: enter image description here

编辑2:如果删除了startup.cs中的代码,并在web.config中添加了代码,那么我开始获取标头,但也开始获取404响应,以查找信号器/集线器。将代码包含在startup.cs和webconfig中会给我以下错误:The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.

2 个答案:

答案 0 :(得分:1)

我从来没有找到解决方案。我最终为js / css文件创建了CDN,该CDN允许我在web.config中设置自定义标头,同时将信号器配置保留在另一个项目中。

答案 1 :(得分:0)

如果我正确理解了您的问题,则您是从浏览器请求 localhost:B ,并且站点B 发送的响应页面会加载一些站点A 中的javascript文件。

如果上面的理解是正确的,并且您收到跨源请求错误,那么您会收到此错误,因为站点A 不允许站点B 请求资源。为此,您必须在站点A 中进行更改,以允许来自站点B 的CORS请求。根据您使用的服务器端语言,您可以在Google上查看如何允许cors请求。 here是.net Web API的示例

修改 我不是.NET开发人员,但只是注意到您的web.config中存在错误。它没有告诉允许哪些方法,所以我在互联网上搜索后发现这是使用web.config的正确方法:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="http://localhost:B"/>
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
  </customHeaders>
<httpProtocol>