Javascript Windows 10上的边缘32位阻止对本地主机的ajax调用,出现网络错误0x2efd
我们有一个应用程序,使用Signal与本地扫描仪驱动程序进行对话,该应用程序已经在IE、Chrome和Firefox上生产了几年,在为Signal下载hubs js头文件时没有问题。Edge发布后,我们发现与localhost对话时出现问题,经过长时间的努力,我们找到了一个允许其通信的设置(并且使用Microsoft票证花费了很多时间,但他们没有找到解决方案),我们决定添加头,以允许Edge授予对域的访问权:Javascript Windows 10上的边缘32位阻止对本地主机的ajax调用,出现网络错误0x2efd,javascript,jquery,ajax,signalr,microsoft-edge,Javascript,Jquery,Ajax,Signalr,Microsoft Edge,我们有一个应用程序,使用Signal与本地扫描仪驱动程序进行对话,该应用程序已经在IE、Chrome和Firefox上生产了几年,在为Signal下载hubs js头文件时没有问题。Edge发布后,我们发现与localhost对话时出现问题,经过长时间的努力,我们找到了一个允许其通信的设置(并且使用Microsoft票证花费了很多时间,但他们没有找到解决方案),我们决定添加头,以允许Edge授予对域的访问权: 访问控制允许原点:https://localhost:11000 这似乎可行,但我们几
访问控制允许原点:https://localhost:11000
这似乎可行,但我们几乎没有注意到它适用于64位Windows10边缘,但不适用于32位Windows10边缘。我花了数小时降低了所有区域的所有安全设置,禁用了保护模式,尝试了不同的ajax技巧来提取文件,但仍然出现错误:
SCRIPT7002:XMLHttpRequest:networkerror 0x2efd,由于错误00002efd,无法完成操作。
以下伪代码失败:
$.ajax({
url: "https://localhost:11000/signalr/hubs",
crossDomain: true,
success: function (data) {
console.log("success");
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error:");
console.log(jqXHR);
}
});
我正在寻找对设置的任何见解或任何其他尝试,或者如果其他人看到这个问题。另一条信息是,fiddler没有显示呼叫的任何流量,因此它似乎被浏览器阻止。同样在使用Edge失败的同一台计算机上,IE、Chrome和FF也会成功。在IE兼容模式下尝试,进入“开发工具”并从顶部下拉列表中进行选择。如果此选项打开时仍出现错误,则IE使用的可能是某些Windows系统文件。此调用是否使用证书身份验证?可能证书已过期,或者Edge使用了不同的身份验证方法?检查IE中的sources选项卡(兼容和不兼容),查看是否正在加载资源,因为Fiddler只捕获HTTP和HTTPS流量。这将为您指出错误等方面的正确方向。最后,也许只需编写一个C#应用程序,向相同的URL发出请求,新版本的.NET可能使用相同的依赖项,这可能会中断您的呼叫。如果是这样的话,C#会给你足够的描述错误来解决这个问题我也有同样的问题。虽然对同一域上的页面的Ajax调用在其他浏览器中都能正常工作,但在Edge中却不能。在不同的选项卡中打开用于Ajax调用的url将得到正确的结果。 将这段代码添加到为Ajax调用提供服务的页面中,以某种方式修复了它。。。代码是用C#编写的,但这可能会让您大致了解如何用其他语言修复它
if (Request.UserHostName == "127.0.0.1")
Response.AppendHeader("Access-Control-Allow-Origin", "*");
你可以试试这个
$.ajax({
url:url,
type:"POST",
data:data,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function(){
//
}
});
并确保正确提供参数、内容类型、数据类型、响应代码..等您的请求缺少以下属性,添加这些属性可以解决问题
GET
,POST
等应用程序/json
,等等json
,XML
等type:"POST",
contentType:"application/json; charset=utf-8",
dataType:"json"
我的Edge也有类似的问题。修复程序需要更改在本地主机上运行的ajax调用和服务器 在ajax调用中,我不得不从旧的text/plain更改为application/json
contentType: 'application/json; charset=utf-8',
本地服务器正在使用Jersey,所以我添加了ContainerResponseFilter实现,该实现添加了访问控制允许标头和访问控制允许方法标头。访问控制允许原点已就位
res.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
res.getHeaders().add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
有几个问题和需要检查的东西。首先,验证
localhost
是否解析为127.0.0.1(我见过一些人把hosts文件弄得一团糟,把事情搞砸了)。第二,证书是否有效?或者自签名证书?@dman2306如果它是64位而不是32位,则它不能作为主机文件,因为它是一个全局资源。在我的回答中,我还建议使用证书。该证书适用于其他3种浏览器。此外,证书未过期。我们在安装时生成一个自签名证书,该证书将持续很长时间。此外,这不是一台计算机的问题,它已经通过我们的QA团队,在多台32位计算机上看到了相同的问题,但在多台64位计算机上没有看到。它通过各种配置进行测试。该问题仅在32位边缘出现。32位Win 7 IE甚至32位Win 10 IE都可以工作。@StevenEdison从我所看到的,Edge将拒绝具有您提到的错误的跨域自签名证书。所以我才提到它。为什么它只发生在32位我不知道,但我在使用自签名证书时遇到了这个问题。实际上,没有其他选择。这是一种不寻常的情况,因为我们正在客户端计算机上安装证书,以便在其计算机上运行一个小型服务器,没有人会签署分发到100000多台计算机(字面上)的“localhost”证书。到目前为止,我们必须跨越一些障碍才能使事情顺利进行(尤其是FF),但除了在Edge 32位上,我们还没有看到这个问题。感谢您提供的信息dman2306,我们将在继续研究该问题时考虑到这一点。IE调试工具有此下拉列表,但边缘调试工具没有看到:。接下来,如何编写一个跨域的C#应用程序?我可以写一个请求,然后再写另一个请求,但不能写CORS。我想我可以编写一个web应用程序,在js中设置一个断点,看看它说了些什么,但即使这样,也会像Edge一样填充相同的ajax事件对象。用IE 11试试,但如果你需要一个跨源应用程序,我会非常乐意提供帮助,但这种问题并不需要C#app来解决,您只需要找出Edge 64位和Edge 32位的区别。。。除了显而易见的:)如文章中所述,它在同一台计算机上的IE上工作(IE 11)