ASP.NET Core — AJAX на стороне клиента не работает для IE11/Edge

avatar
susieloo_
8 апреля 2018 в 03:51
558
0
3

Я буквально более 5 дней изучал проблему, которая существует только в IE и Edge (работает в Chrome, FireFox и т. д.). Я просмотрел почти все ссылки и перепробовал почти все, но кажется, что большая часть контента/ответов из старых сообщений очень устарела.

Общие сведения: Я создал веб-службу ASP.NET Core — она работает на каком-то порту на локальном хосте. В идеале, я бы предложил своим пользователям открывать локальный html-документ (то есть жить в своей локальной файловой системе, а не размещаться на сервере), который пингует веб-службу через AJAX (который возвращает некоторый JSON), что позволяет использовать этот контент из Интернета. сервис для отображения в html-документе. Он буквально работает во всех браузерах, кроме 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, за исключением что он будет выдавать предупреждение при каждом пинге, сделанном на веб-служба, касающаяся безопасности: "This page is accessing information that is not under its control. This poses a security risk. Do you want to continue?" Это абсолютно раздражает, и я не позволю своим клиентам изменять для этого свои настройки безопасности. Это также вообще не работает для Edge.
  2. Изменение атрибута crossDomain в вызове AJAX на false - поведение такое же, как и выше, за исключением того, что теперь оно не будет работать для всех других браузеров.
  3. Я много читал об использовании dataType: 'jsonp', но, насколько мне известно, он устарел и поддерживает только запросы GET. Так что я не пробовал это и хочу держаться подальше от этого.
  4. Я также читал, что, поскольку я пытаюсь получить доступ к веб-службе через локально расположенный неразмещенный файл (т.е. URL-адрес file:// вместо http://), он технически не поддерживается в качестве источника, поэтому разрешение любого происхождения не поможет в этом случае. Я не уверен, насколько это правда или даже как это проверить. Несмотря на это, я не пытался обслуживать html-файл через локальный хост, потому что я не хочу требовать, чтобы мои клиенты делали это только для IE/Edge, когда он отлично работает со всеми другие браузеры.
  5. Я пытался использовать XMLHttpRequest вместо вызова and AJAX. Затем мне нужно выполнить JSON.parse(result);, но, похоже, он отлично работает для всех браузеров, включая IE, кроме Edge...

Я в некоторой степени понимаю CORS и ограничения политики одного и того же источника, но я абсолютно не понимаю, в чем разница между браузерами Microsoft и остальными.

Пожалуйста, помогите!

Источник

Ответы (0)