Опубликовать JSON-запрос AJAX с Cors не работает в IE10 / Edge

jquery ajax wcf cors iis-7.5

2530 просмотра

1 ответ

121 Репутация автора

Предыстория: - Я создал службу WCF, размещенную в моей локальной системе IIS. Сервис предоставляет доступ к методам GET / POST и кросс-доменам. Доступ к ним также возможен через https. Чтобы сделать его доступным, используется самозаверяющий сертификат.

Тестирование: - Когда я пытаюсь сделать междоменный вызов ajax, он отлично работает для GET-запроса и POST-запроса (только для тех методов post, которые не принимают данные как json) в IE10 / Edge. Я могу сделать междоменный вызов для любого запроса GET / POST в браузере Chrome / Firebox. Только это IE 10 / Edge, который вызывает проблему, чтобы сделать междоменный вызов для запроса POST, когда параметр contenttype: accept / json передается в вызове ajax.

Исследование: - Я читаю много блогов / mdn и узнаю спецификацию cors, в которой IE не следит за cors неукоснительно. Я знаю, что спецификация cors не допускает значения настраиваемого заголовка / заголовка, из-за чего предварительная проверка cors прервана.

Пример запроса ajax, который я делаю: -

var postDT = { "postValue": "test" };
        debugger;
        $.support.cors = true;
        $.ajax({
            type: "POST",
            data: JSON.stringify(postDT),
            url: "http://ateet3371/Service1.svc/postdata",
            contentType: "application/json; charset=utf-8",
            dataType: "JSON",
            processData: true,
            success: function (data) {
                 alert(data);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                var a = jqXHR;
                alert(jqXHR + '---' + textStatus + '---' + errorThrown);
            }
        });

Если я удалил contentType: "application/json; charset=utf-8"тогда, это выдаст ошибку плохого запроса, иначе это выдаст ошибку отказа в доступе.

И реализация метода в WCF - это:

[OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostResponseData")]
    string PostResponseData(PostDataTest postDT);

И датаконтракт это: -

[DataContract]
public class PostDataTest
{
    private string post_value;

    // Apply the DataMemberAttribute to the property.
    [DataMember]
    public string postValue
    {

        get { return post_value; }
        set { post_value = value; }
    }
}

Если я использую данные метода PostUrl, то вызов ajax выполняется успешно и возвращает правильные результаты, если ContentType: заголовок «Application / json» удален из запроса.

[OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostUrlData/{value}")]
    string PostUrlData(string value);

Я уже пишу код в событии BeginRequest в Global.asax WCF для обработки запроса параметров: -

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS" )
        { 
        //These headers are handling the "pre-flight" OPTIONS call sent by the browser
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, HEAD");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, Session");
        HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "DAV, content-length, Allow" );
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache,no-store");
        HttpContext.Current.Response.End();
        } 

И я не могу включить Allow cross domain callнастройки в IE, так как конечный пользователь не будет делать такие шаги.

Застрял в проблеме: - Но все еще не в состоянии сделать вызов данных JSON в IE 10 / Edge (которые включены Cors).

(Отредактировано) Обновления: на сайте IIS, где размещен WCF,включенатолько анонимная аутентификация, в то время как другие аутентификации отключены. Даже я пытался с действительным сертификатом для https, но все же он не работает для IE, но отлично работает для Chrome.

Заголовок запроса

OPTIONS https://service.domian.com/projectservice.svc/GetMultiListData HTTP/1.1 Accept: */* Origin: https://sitename.servicedomain.com Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type, accept Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Host: sitename.servicedomain.com Content-Length: 0 Connection: Keep-Alive Cache-Control: no-cache

Заголовки ответа

HTTP/1.1 200 OK Cache-Control: no-cache,no-store Server: Microsoft-IIS/7.5 Access-Control-Allow-Origin: sitename.servicedomain.com Access-Control-Allow-Methods: GET,POST,PUT,HEAD Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Origin,Content-Type,Accept,X-Requested-With,Session Access-Control-Expose-Headers: DAV,content-length,Allow Access-Control-Max-Age: 1728000 X-Powered-By: ASP.NET Date: Thu, 04 Aug 2016 17:26:27 GMT Content-Length: 0

Пожалуйста, помогите мне, поскольку я просматриваю много статей и блогов и все еще не могу решить проблему. Ваша помощь будет принята с благодарностью!

ЭКСПЕРТ, ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ!

Автор: ateet Источник Размещён: 19.07.2016 07:11

Ответы (1)


0 плюса

6187 Репутация автора

Есть несколько вещей, которые вы можете проверить на стороне клиента:

  • ты пытаешься переопределить $.support.cors. Это (или должно было) быть читаемым свойством, сообщающим вам, поддерживается ли CORS браузером. (см. источник jQuery, где это проверено)
  • На основе документов JQuery для AJAX вы можете добавить xhrFields: { withCredentials: true }к $.ajax()параметрам
  • Используйте правильный корпус dataType: "json"иcharset=UTF-8

На стороне сервера вы можете попытаться ответить определенным именем хоста (повторить Originзаголовок) вместо подстановочного знака ( *) в Access-Control-Allow-Originзаголовке ответа. Это специально упоминается в MDN в параграфе, где также обсуждаются Access-Control-Allow-Credentials:

Важное примечание: при ответе на запрос учетных данных сервер должен указать домен и не может использовать групповые символы. Вышеприведенный пример потерпит неудачу, если заголовок будет подстановочным символом: Access-Control-Allow-Origin: *.

Автор: searlea Размещён: 02.08.2016 08:24
Вопросы из категории :
32x32