一周来,我一直在试图解决此问题。希望有人能看到我想念的东西。
我有两个项目:localhost:A
(Web-Api)托管一个js文件,而localhost:B
(.NET MVC)使用该js文件。尝试在js文件中捕获错误并将其发送到localhost:A
时,我得到了一条神秘的Script Error
消息,而不是实际错误。
谷歌快速搜索告诉我这是一种安全措施,可防止localhost:A
收集有关客户端的信息。为了解决这个问题,我需要做两件事:
crossorigin='anonymous'
的引用localhost:B
添加到js文件中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传输与标头一起发生,但是正在提取的文件缺少标头。
我想念什么?
编辑2:如果删除了startup.cs中的代码,并在web.config中添加了代码,那么我开始获取标头,但也开始获取404响应,以查找信号器/集线器。将代码包含在startup.cs和webconfig中会给我以下错误:The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.
答案 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>