2016-06-30 19 views
1

ich AngularJS verwende und das ist mein Code in einer Fabrik, dieOPTIONS Methode nicht erlaubt. Erhalten Sie Works, aber nicht POST

var data = { ticket: JSON.stringify(aticket), "autoAssignDefaultSLA": "true", "autoAssignDefaultPriority": "true" }; 

      return $http({ 
       method: 'POST', 
       url: requestUrl, 
       data: data, 
       headers: { 'Content-Type': 'application/json; charset=UTF-8' } 
      }); 

eine HTTP-GET-Aufruf funktioniert HTTP POST Anruf macht und ich json wieder ohne Probleme

return $http({ 
       method: 'GET', 
       url: requestUrl, 
       params: { userToken: userToken, assignedIds: contactId, companyIds: "" } 
      }); 

Wenn Sie den Inhaltstyp auf application/json setzen, wird eine OPTIONS-Anfrage gesendet. In meinen Tests scheint es bisher so zu sein, dass das Setzen des Inhaltstyps auf "application/x-www-form-urlencoded" nicht möglich ist, da der Web-Service nur json-Daten akzeptiert. Ich habe keinen Zugriff, um den Web-Service-Code zu ändern. Ein anderes Team kümmert sich darum.

Die Anforderungs-Header, die mit Optionen geht, ist

Host: staging.url.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate, br 
DNT: 1 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Origin: https://url.synbeta.com 
Connection: keep-alive 

Die Antwort-Header ist wie

Access-Control-Allow-Headers: Authorization, Content-Type, If-None-Match, Cookie, Cookies, x-session-id, x-atg-host 
Access-Control-Allow-Methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS 
Access-Control-Allow-Origin: * 
Allow: POST 
Cache-Control: private 
Content-Length: 1565 
Content-Type: text/html; charset=UTF-8 
Date: Thu, 30 Jun 2016 16:39:48 GMT 
Server: Microsoft-IIS/7.5 
Set-Cookie: ASP.NET_SessionId=p5aolcjpwd0qfhqjdbluha1h; path=/; HttpOnly 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 

Das Verfahren folgt noch nicht erlaubt. Ich bekomme "405 Methode nicht erlaubt".

Ich denke, es ist, weil die "Access-Control-Erlaube-Header" mir Typen sendet und die "Content-Type" -Fall nicht übereinstimmt.

Der Client und der Server werden auf HTTPS ausgeführt.

Irgendwelche Einsichten?

abgewinkelte Ausführung: 1.5.7

aktualisieren

Der Webservice-Entwickler folgte diesem Leitfaden CORS auf dem Server zu ermöglichen, und es funktionierte. http://enable-cors.org/server_wcf.html

+0

da ich den Server-Code nicht ändern kann zum Endpunkt Ich bin offen, um den Request-Header an sich ändernde "Access-Control-Request-Header", so wird dessen Wert auf "Content-Type" gesetzt "content-type" – iJK

+0

Fragen Sie das Webservice-Team, ob sie die POST-Methode wirklich unterstützen. –

+0

POST ist erlaubt. Ich kann den Code über TFS sehen. [WebInvoke (Methode = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest)] [OperationContract] – iJK

Antwort

0

Aus der obigen Antwort und die URL erwähnt http://enable-cors.org/server_wcf.html

Nachricht Inspector erstellen

public class CustomHeaderMessageInspector : IDispatchMessageInspector 
      { 
       Dictionary<string, string> requiredHeaders; 
       public CustomHeaderMessageInspector (Dictionary<string, string> headers) 
       { 
        requiredHeaders = headers ?? new Dictionary<string, string>(); 
       } 

       public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
       { 
        return null; 
       } 

       public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
       { 
        var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
        foreach (var item in requiredHeaders) 
        { 
         httpHeader.Headers.Add(item.Key, item.Value); 
        }   
       } 
      } 

erstellen Endpoint Verhalten und Message Inspector verwenden, um Header hinzufügen

public class EnableCrossOriginResourceSharingBehavior : BehaviorExtensionElement, IEndpointBehavior 
      { 
       public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
       { 

       } 

       public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
       { 

       } 

       public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
       { 
        var requiredHeaders = new Dictionary<string, string>(); 

        requiredHeaders.Add("Access-Control-Allow-Origin", "*"); 
        requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS"); 
        requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type"); 

        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders)); 
       } 

       public void Validate(ServiceEndpoint endpoint) 
       { 

       } 

       public override Type BehaviorType 
       { 
        get { return typeof(EnableCrossOriginResourceSharingBehavior); } 
       } 

       protected override object CreateBehavior() 
       { 
        return new EnableCrossOriginResourceSharingBehavior(); 
       } 
      } 

Registrieren Sie neues Verhalten im Web. Config

<extensions> 
       <behaviorExtensions>   
       <add name="crossOriginResourceSharingBehavior" type="Services.Behaviours.EnableCrossOriginResourceSharingBehavior, Services, Version=1.0.0.0, Culture=neutral" />   
       </behaviorExtensions>  
      </extensions> 

neues Verhalten hinzufügen Verhalten Konfiguration

<endpointBehaviors>  
      <behavior name="jsonBehavior"> 
       <webHttp /> 
       <crossOriginResourceSharingBehavior /> 
      </behavior> 
      </endpointBehaviors> 

konfigurieren Endpunkt

<endpoint address="api" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="Service.IServiceContract" /> 
+0

Irgendeine Ausarbeitung zu diesem Prozess? Ich habe diese gerade zu meiner app.config hinzugefügt und meine Anwendung ist jetzt unglücklich. – ThePartyTurtle