2016-07-19 136 views
12

Contesto: - Ho creato un servizio WCF ospitato nel mio sistema locale IIS. Il servizio espone il metodo GET/POST e il dominio incrociato abilitato ed è possibile accedervi utilizzando anche https. Per renderlo accessibile, viene utilizzato un certificato autofirmato.Post richiesta JSON ajax con cors non funzionante in IE10/Edge

controllo: - Quando provo a fare croce dominio ajax chiamano funziona bene per la richiesta GET e POST richiesta (solo quelli metodo post che non sono accettando dati come JSON) in IE10/Edge. Sono in grado di effettuare chiamate interdominio per qualsiasi richiesta GET/POST nel browser chrome/Firebox. Solo che è IE 10/Edge che causa problemi a effettuare chiamate tra domini per richieste POST quando contenttype: accept/json parametro viene passato in una chiamata ajax.

Ricerca: - Ho letto un sacco di blog/MDN e conosco le specifiche del cors in cui IE non segue cors religiosamente. So che le specifiche cors non includono il valore dell'intestazione/intestazione personalizzata a causa del quale il preflight del corsivo ha abortito.

Esempio di richiesta AJAX sto facendo: -

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); 
      } 
     }); 

Se ho rimosso contentType: "application/json; charset=utf-8" allora gettare errore di richiesta cattivo altrimenti gettare errore di accesso negato.

e il metodo di implementazione in WCF è: -

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

E 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; } 
    } 
} 

Se uso i dati posturl metodo allora chiamata AJAX viene eseguito con successo e restituire i risultati corretti se ContentType: L'intestazione "Applicazione/JSON" viene rimossa dalla richiesta.

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

ho già scrivere il codice in caso BeginRequest in Global.asax di WCF per gestire la richiesta Opzioni: -

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(); 
     } 

e non posso permettere Allow cross domain call impostazione in IE come utente finale non fare tali passaggi.

Stuck in Problem: - Tuttavia, non è ancora possibile eseguire la chiamata di dati JSON in IE 10/Edge (che sono cors abilitati).

(Edited) Aggiornamenti: sito IIS in cui è ospitato WCF hanno solo autenticazione anonima abilitata, mentre altri di autenticazione sono disattivate. Anche se ho provato con certificato valido per https, ma ancora non funziona per IE ma funziona perfettamente per Chrome.

Request Header

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

risposta intestazioni

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

Please help me mentre passo attraverso un sacco di articoli e blog e ancora non riesco a risolvere il problema. Il tuo aiuto sarà molto apprezzato!

ESPERTI PER FAVORE AIUTATEMI!

+0

Vuol cambiare dataType a "jsonp" consentire la richiesta? –

+0

L'ho provato, consente la richiesta ma ha generato un errore di richiesta errato. – ateet

risposta

0

Ci sono alcune cose che si possono verificare sul lato client:

  • si sta cercando di sostituire $.support.cors. Questo è (o era) pensato per essere una proprietà leggibile che ti dice se CORS è supportato dal browser. (Vedi jQuery source per cui questa opzione è selezionata)
  • Basato su jQuery docs for ajax si potrebbe desiderare di aggiungere xhrFields: { withCredentials: true } alle $.ajax() opzioni
  • uso corretto involucro di dataType: "json" e charset=UTF-8

A lato server, si consiglia di Prova rispondere con specifico hostname (eco l'intestazione Origin) anziché jolly (*) nell'intestazione Access-Control-Allow-Origin risposta. Questo è esplicitamente menzionata nella MDN in un paragrafo a discutere anche Access-Control-Allow-Credentials:

Nota importante: quando si risponde a una richiesta di credenziali, server deve specificare un dominio, e non può usare cardatura selvaggio. L'esempio precedente fallirebbe se l'intestazione fosse jolly come: Access-Control-Allow-Origin: *.

+0

Ho rimosso $ .support.cors poiché è già vero, corretto la sintassi per datatype e charset. E imposta Access-Control-Allow-Origin su domian da dove sto chiamando il servizio. Ma ancora non funziona. – ateet

+0

Puoi condividere il codice che stai utilizzando per impostare Access-Control-Allow-Origin - solo per confermare il suo presente sia sulla richiesta pre-volo che su quella reale, oltre a controllarne il contenuto (echoing 'Origin' o hard- codificato per includere il giusto protocollo http: // 'vs' https: // '.) Mi chiedo anche se stai riscontrando problemi in IE10/Edge se usi un servizio come [test-cors.org] (http : //test-cors.org/)? – searlea

+0

Come dovrei condividere il codice? Intendo il tuo qualsiasi id dove posso condividerti? – ateet

Problemi correlati