2016-07-19 1 views
12

Hintergrund: - Ich erstellt einen WCF-Dienst in meinem lokalen System IIS gehostet. Der Dienst stellt die GET/POST-Methode und die domänenübergreifende Aktivierung bereit und kann auch über HTTPS aufgerufen werden. Um es zugänglich zu machen, wird ein selbstsigniertes Zertifikat verwendet.Post JSON Ajax Anfrage mit Cors funktioniert nicht in IE10/Edge

Testen: - Wenn ich versuche, domainübergreifenden Ajax zu tun, funktioniert es gut für GET-Anfrage und POST-Anfrage (nur die Post-Methode, die Daten nicht als JSON akzeptieren) in IE10/Edge. Ich bin in der Lage, domainübergreifenden Aufruf für jede GET/POST-Anfrage in Chrome/Firebox-Browser zu machen. Nur IE 10/Edge verursacht das Problem, einen Domain-übergreifenden Aufruf für eine POST-Anforderung zu machen, wenn der Parameter contentype: accept/json im Ajax-Aufruf übergeben wird.

Forschung: - Ich lese viele Blogs/MDN und lernen Sie die Spezifikation von Cors, in denen IE nicht folgt religiös Cors. Ich weiß, Cors Spezifikation nicht benutzerdefinierten Header/Header-Wert, aufgrund der Kors Preflight abgebrochen.

Beispiel von Ajax-Request Ich mache: -

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

Wenn ich contentType: "application/json; charset=utf-8" entfernt dann werfen Sie es schlecht Anfrage Fehler es sonst der Zugriff verweigert Fehler werfen.

Und Methodenimplementierung in WCF ist: -

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

Und Datacontract ist: -

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

Wenn i Methode PostURL Daten verwenden, dann Ajax-Aufruf erfolgreich ausgeführt und korrekte Ergebnisse, wenn Content zurück: Der Header "Application/json" wurde aus der Anfrage entfernt.

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

ich bereits Code in Beginrequest Ereignis in Global.asax von WCF Schreibanforderung zu behandeln Optionen: -

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

und ich kann nicht Allow cross domain call Einstellung im Internet Explorer als Endbenutzer ermöglichen würde, nicht mach solche Schritte.

Fest in Problem: - Aber immer noch nicht in der Lage, JSON Daten Post Aufruf in IE 10/Edge (die Cors aktiviert sind) zu tun.

(Edited) Updates: IIS-Website, wo WCF gehostet wird nur Anonyme Authentifizierung aktiviert, während andere Authentifizierung deaktiviert sind. Sogar ich versuchte mit gültigem Zertifikat für https, aber es funktioniert immer noch nicht für IE aber funktioniert perfekt für Chrom.

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

Antwortheader

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

Bitte helfen ich als ich durch viele Artikel und Blog und immer noch nicht in der Lage, das Problem zu lösen. Ihre Hilfe wird sehr geschätzt!

EXPERT BITTE HELFEN SIE MICH!

+0

Ermöglicht die Änderung von dataType auf "jsonp" die Anfrage? –

+0

Ich habe es versucht, es erlauben Anfrage aber dow schlechte Anfrage Fehler. – ateet

Antwort

0

Es gibt ein paar Dinge, die Sie clientseitige überprüfen:

  • Sie versuchen $.support.cors außer Kraft zu setzen. Dies ist (oder war) eine lesbare Eigenschaft, die Ihnen sagt, ob CORS vom Browser unterstützt wird. (Siehe jQuery source für, wo diese Option aktiviert ist)
  • Basierend auf jQuery docs for ajax Sie könnten xhrFields: { withCredentials: true } die $.ajax() Optionen
  • Korrektes Gehäuse dataType: "json" und charset=UTF-8

Auf Server-Seite hinzufügen möchten, mögen Sie vielleicht Versuchen Sie, mit einem bestimmten Hostnamen (Echo Origin Header) anstelle von Wildcard (*) im Antwortheader Access-Control-Allow-Origin zu antworten. Dies ist speziell in MDN in einem Absatz erwähnt auch Access-Control-Allow-Credentials Diskussion:

Wichtiger Hinweis: wenn sie auf eine credentialed Anforderung reagiert, Server eine Domäne angeben muß, und nicht die wilde Krempel verwenden kann. Das obige Beispiel würde fehlschlagen, wenn die Kopfzeile wie folgt geschützt wäre: Access-Control-Allow-Origin: *.

+0

Ich habe $ .support.cors entfernt, da dies bereits der Fall ist, die Syntax für Datentyp und Zeichensatz wurde korrigiert. Und legen Sie den Access-Control-Allow-Origin für Domian fest, von dem aus ich den Service anrufe. Aber es funktioniert immer noch nicht. – ateet

+0

Können Sie den Code teilen, den Sie verwenden, um Access-Control-Allow-Origin zu setzen - nur um zu bestätigen, dass er sowohl vor dem Flug als auch nach echten Anforderungen vorhanden ist, sowie seinen Inhalt (entweder "Origin" oder hart) codiert, um das richtige 'http: //' vs 'https: //' Protokoll zu enthalten.) Ich frage mich auch, ob Sie irgendwelche Probleme in IE10/Edge sehen, wenn Sie einen Dienst wie [test-cors.org] (http: // : //test-cors.org/)? – searlea

+0

Wie soll ich Ihnen den Code mitteilen? Ich meine deine ID, wo ich dich teilen kann? – ateet