2016-07-19 2 views
12

Фон: - Я создал службу WCF, размещенную в моей локальной системе IIS. Служба предоставляет метод GET/POST и разрешен кросс-домен и может быть доступен с помощью https. Чтобы сделать его доступным, используется самозаверяющий сертификат.Сообщение JSON ajax request with cors не работает в IE10/Edge

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

Исследование: - Я прочитал много блогов/mdn и узнал спецификацию cors, в которой IE не следует религиозным отношениям. Я знаю, что спецификация 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" то бросить плохую ошибку запроса иначе это бросить ошибку доступа.

и метод реализации в ФОС: -

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

И DataContract является: -

[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: Заголовок «Приложение/json» удаляется из запроса.

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

Я уже писать код в BeginRequest события в Global.asax ФОС для обработки запроса опции: -

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).

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

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

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

Response Headers

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

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

EXPERT ПОЖАЛУЙСТА, ПОМОГИТЕ МЕНЯ!

+0

ли изменение DATATYPE к "JSONP" разрешить запрос? –

+0

Я попробовал, он разрешает запрос, но ошибается ошибка запроса. – ateet

ответ

0

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

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

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

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

+0

Я удалил $ .support.cors, поскольку он уже верен, исправил синтаксис для типа данных и charset. И установите для Access-Control-Allow-Origin значение для domian, откуда я звоню в службу. Но все равно это не сработает. – ateet

+0

Можете ли вы поделиться кодом, который вы используете, чтобы установить Access-Control-Allow-Origin - только для подтверждения его присутствия как перед полетом, так и с реальным запросом, а также для проверки его содержимого (либо эхо-сигнала «Origin», закодированный, чтобы включить правильный протокол http: // 'vs' https: // '. Мне также интересно, видите ли вы какие-либо проблемы в IE10/Edge, если вы используете такую ​​услугу, как [test-cors.org] (http : //test-cors.org/)? – searlea

+0

Как мне поделиться вашим кодом? Я имею в виду ваш любой идентификатор, где я могу поделиться с вами? – ateet