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!
Vuol cambiare dataType a "jsonp" consentire la richiesta? –
L'ho provato, consente la richiesta ma ha generato un errore di richiesta errato. – ateet