ASP.NET核心 - 客户端AJAX不适用于IE11 / Edge

时间:2018-04-08 03:51:30

标签: javascript ajax asp.net-core cors microsoft-edge

对于仅存在于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;
    };
}

我尝试过的事情:

  1. 使用$.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。
  2. 将AJAX调用中的crossDomain属性更改为false - 行为与上述相同,但现在不适用于所有其他浏览器。
  3. 我已经阅读了很多关于使用dataType: 'jsonp'的内容 - 但据我所知,它已被弃用且仅支持GET请求。所以我没试过这个,想要远离它。
  4. 我也读过这个,因为我试图通过本地驻留的非托管文件(即网址为file://而不是http://)来访问网络服务技术上不支持作为原点 - 所以在这种情况下允许任何来源都不会有帮助。我不确定这是多么真实,甚至不知道如何测试。无论如何,我还没有尝试通过localhost提供html文件,因为我不想要求我的客户在完全没问题的情况下必须为IE / Edge 执行 与所有其他浏览器一起使用。
  5. 我尝试使用XMLHttpRequest代替和AJAX调用。它需要我做JSON.parse(result);,但似乎适用于所有浏览器,包括IE,除了Edge ...
  6. 我在某种程度上理解CORS和相同来源政策的局限性,但我完全不了解Microsoft浏览器与其他浏览器之间的区别。

    请帮忙!

0 个答案:

没有答案