对于仅存在于IE和Edge(在Chrome,FireFox等中工作)的问题,我一直在研究5天以上。我已经浏览了几乎所有的链接并尝试了几乎所有内容,但似乎很多帖子中的很多内容/答案都已经过时了。
后台:我创建了一个ASP.NET Core Web服务 - 它在localhost上的某个端口上运行。理想情况下,我让我的用户打开一个本地驻留的html文档(意味着生活在他们的本地文件系统而不是托管在服务器上),通过AJAX(返回一些JSON)来ping Web服务 - 允许来自要在html文档中显示的Web服务。它实际上适用于除IE和Edge之外的所有浏览器(我使用的是IE11)。
这是我的Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
...
services.AddCors(o => o.AddPolicy("ContentServices", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
services.AddMvc();
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseCors("ContentServices");
...
}
这是我的SearchController.cs:
[EnableCors("ContentServices")]
public SearchResponse Query(string index, string input, SearchType searchType, int page = 0, int pageSize = 20)
{
SearchResponse sr = new SearchResponse;
...
return sr;
}
以下是我的JavaScript代码:
function WebService(url, successMsg, errorMsg) {
return $.ajax({
url: searchDestinationUrl + url,
type: "GET",
crossDomain: true,
dataType: "json",
success: function (results) {
return results;
},
error: function (xhr, status, error) {
console.error(error + " - " + errorMsg);
}
});
}
function RunGeneralSearch(input, options) {
var search = WebService("search/query?index=" + index + "&input=" + input + "&page=" + options.content.pageIndex + "&pageSize=" + options.content.pageSize, "", "Search failed.")
.then(function (response) {
var searchResults = [];
searchResults.content = [];
searchResults.contentTotal = response.total;
searchResults.clientPaging = false;
var results = response.results;
if (results.length > 0) {
var Search = MadCap.CreateNamespace("WebHelp.Search");
for (var i = 0; i < results.length; i++) {
var result = results[i];
var rank = result["rank"];
var title = result["title"];
var link = result["link"];
var linkUrl = GetLinkUrl(link);
var abstractText = result["abstractText"];
var searchResult = new Search.SearchResult(rank, title, linkUrl.FullPath, unescape(abstractText));
searchResults.content.push(searchResult);
}
}
return searchResults;
});
return search;
};
}
我尝试过的事情:
$.support.cors = true
将适用于IE,但有例外
它将提示每个ping的警告
关于安全性的Web服务:"This page is accessing information that is not under its control. This poses a security risk. Do you want to continue?"
这绝对令人讨厌,我不会让我的客户修改他们的安全设置。这根本不适用于Edge。crossDomain
属性更改为false
- 行为与上述相同,但现在不适用于所有其他浏览器。dataType: 'jsonp'
的内容 - 但据我所知,它已被弃用且仅支持GET请求。所以我没试过这个,想要远离它。file://
而不是http://
)来访问网络服务技术上不支持作为原点 - 所以在这种情况下允许任何来源都不会有帮助。我不确定这是多么真实,甚至不知道如何测试。无论如何,我还没有尝试通过localhost提供html文件,因为我不想要求我的客户在完全没问题的情况下必须为IE / Edge 执行 与所有其他浏览器一起使用。XMLHttpRequest
代替和AJAX调用。它需要我做JSON.parse(result);
,但似乎适用于所有浏览器,包括IE,除了Edge ... 我在某种程度上理解CORS和相同来源政策的局限性,但我完全不了解Microsoft浏览器与其他浏览器之间的区别。
请帮忙!