2016-06-30 3 views
1

Я использую angularJS и это мой код на фабрике, которая делает HTTP POST позвонитьВАРИАНТЫ Метод не допускается. Получить Работает, но не 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' } 
      }); 

An работает вызов HTTP GET и я получаю JSON обратно без проблем

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

Установив Content-Type в приложение/json, выдается запрос OPTIONS. До сих пор в моих тестах оказалось, что настройка типа контента на «application/x-www-form-urlencoded» невозможна, потому что веб-служба будет принимать только данные json. У меня нет доступа для изменения кода веб-службы. Другая команда позаботится об этом.

заголовки запроса, который идет с ВАРИАНТОВ является

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 

Заголовки ответа заключается в следующем

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 

Способ по-прежнему не допускается. Я получаю «405 метод не допускается».

Я думаю, что это потому, что «Access-Control-Allow-Headers» отправляет мне типы, а случай «Content-Type» не сопоставляется.

Клиент и сервер работают на HTTPS.

Любые идеи?

угловая версия: 1.5.7

Update

Разработчик веб-сервис, а затем это руководство, чтобы включить CORS на сервере, и он работал. http://enable-cors.org/server_wcf.html

+0

, так как я не могу изменить код сервера Я открыт для изменения заголовка запроса «Access-Control-Request-Headers», поэтому его значение устанавливается на «Content-Type» вместо «content-type» – iJK

+0

Спросите команду webservice, если они действительно поддерживают метод POST. –

+0

POST разрешен. Я вижу код через TFS. [WebInvoke (Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest)] [OperationContract] – iJK

ответ

0

Из приведенного выше ответа и URL упоминается http://enable-cors.org/server_wcf.html

Создать сообщение Инспектор

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

Создание конечных точек поведения и использовать Message Inspector, чтобы добавить заголовки

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

Зарегистрируйте новое поведение в сети.конфиг

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

Добавить новое поведение в конечной точке конфигурацию поведения

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

Настройка конечных точек

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

Любая разработка этого процесса? Я просто добавил их в свой app.config, и мое приложение теперь несчастливо. – ThePartyTurtle

Смежные вопросы