it-swarm.com.de

Antwort für Preflight hat ungültigen HTTP-Statuscode 405

Ich habe viele ähnliche Probleme in StackOverflow gelesen, aber die Lösungen funktionieren nicht für mich. 

Ich habe WCF REST Dienst:

[<OperationContract>]    
    [<WebInvoke(UriTemplate = "PostItem", 
            RequestFormat= WebMessageFormat.Json,   
            ResponseFormat = WebMessageFormat.Json, Method = "POST")>]         

Ich kann es mit Postman (Chrome-Erweiterung) verwenden. Ich übergebe Daten als "roh", nicht als "urlencoded". Und ich bekomme 200 Rückkehrcode.

 enter image description here

Ich muss diese Methode mit anglejs aufrufen:

    $http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',                   
                {
    "Address": "г. Москва, ул. Соколово-Мещерская, д.25",
     ...
    "User": ""
      })  

Ich habe gerade URL und JSON von Postman kopiert. Aber ich bekomme den Fehler:

angle.js: 10722 OPTIONEN http://192.168.1.65/Service1.svc/restapi/PostItemhttp://192.168.1.65/Service1.svc/restapi/PostItem . Antwort für Preflight hat ungültigen HTTP-Statuscode 405

Ich habe ähnliche Probleme gesucht und zwei Lösungen gefunden:

  1. Verwenden Sie jQuery, um den Header Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' festzulegen, er funktioniert jedoch nicht mit meinem WCF-Dienst
  2. Festlegen von benutzerdefinierten Headern in meiner Web.Config:

    <httpProtocol>
       <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Content-Type" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
       </customHeaders>
    </httpProtocol>
    

Es hilft mir nicht. Und ich bin nicht sicher, dass der Grund des Fehlers auf der Serverseite liegt. Die Postman-Erweiterung kann diese Methode erfolgreich aufrufen.

Wie kann ich mit AngularJS denselben POST - Anruf tätigen?

Update:

Hier ist OPTIONS-Anfrage:

 enter image description here

Die Registerkarten "Überprüfen" und "Antwort" sind leer

Update 2:

In IE funktioniert alles einwandfrei, in Chrome jedoch nicht.

10
demas

Sieht aus wie ich eine Lösung gefunden habe. Ich habe gerade eine zweite Methode hinzugefügt:

[<OperationContract>]    
[<WebInvoke(UriTemplate = "PostTest", 
        RequestFormat= WebMessageFormat.Json,   
        ResponseFormat = WebMessageFormat.Json, Method = "POST")>]         
abstract PostTest: obj: Test -> unit

[<OperationContract>]    
[<WebInvoke(UriTemplate = "PostTest", 
        RequestFormat= WebMessageFormat.Json,   
        ResponseFormat = WebMessageFormat.Json, Method = "OPTIONS")>]         
abstract PostTestOptions: unit -> unit

Es sind nur leere Methoden, die nichts bewirken. Ich kenne den Grund nicht, aber alles funktioniert.

6
demas

Selbst eine geschlossene Frage möchte ich zeigen, welche Arbeit für mich funktioniert. 

Zuerst müssen Sie CORS in der web.config aktivieren (wie Mihai sad):

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,     OPTIONS" />
  </customHeaders>
</httpProtocol>

Wenn Sie zusätzliche HEADER-Parameter haben, müssen Sie sie zu Access-Control-Allow-Headern hinzufügen, z.

<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" />

Und schließlich müssen Sie zur Bearbeitung von OPTIONS-Anforderungen mit leerer Antwort antworten und Ihre Anwendungsklasse hinzufügen:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}
24
Tiago Gouvêa

Das hat zwar schon eine Antwort, aber hier ist meine Lösung ..__ In der Web-Config muss man die Anweisung zu <remove name="OPTIONSVerbHandler" /> entfernen 

Fügen Sie zunächst die customHeaders hinzu 

<httpProtocol>
  <!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS -->
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="content-Type, accept, Origin, X-Requested-With, X-Authentication, name" />
  </customHeaders>
</httpProtocol>

Dann kommentieren oder löschen Sie die Anweisung, um den OPTIONSverbHandler zu entfernen

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <!-- <remove name="OPTIONSVerbHandler" /> -->
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
1
Morvael

Lösung, die für mich funktioniert hat: 

  1. Fügen Sie dies zu web.config (serverseitig) hinzu:

     <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,  OPTIONS" />
      </customHeaders>
    </httpProtocol>
    
  2. Erstellen Sie eine Global.asax-Datei (globale Anwendungsklasse) und fügen Sie den folgenden Code hinzu: 

        protected void Application_BeginRequest(object sender, EventArgs e){
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
                {
                    Response.Flush();
                }
        }
    
0
Tech Enthusiast

Seit IIS Team veröffentlicht IIS CORS-Modul Hacks wie leere Methoden werden nicht mehr benötigt. Es behandelt CORS einschließlich Preflight-Anforderungen ordnungsgemäß. Sie können es beispielsweise in der Web-Konfiguration konfigurieren:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add Origin="*" />
            <add Origin="https://*.Microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add Origin="http://*" allowed="false" />
        </cors>
    </system.webServer>
</configuration>
0
Jesús López

Ich habe gerade das gleiche Problem mit dem Löschen von xhr.setRequestHeader() in meiner AJAX - Anfrage gelöst. Wenn jemand einen Code hat, versuchen Sie ihn zu entfernen.

0
muinh