CORS预检没有返回

时间:2013-08-05 20:32:51

标签: jquery iis-7.5 cors

我正在努力实现CORS,以便我的Ember应用可以与另一台服务器上的API通信。我需要发送两个请求:通过POST发送身份验证请求,然后向其中一个API端点发送GET请求。

两个请求都启动了预检请求。验证预检请求运行正常。然后,当我向API运行请求时,预检请求会挂起。 Chrome会将状态和类型显示为“待处理”,请求永远不会完成。

这是验证码。我在这里使用jQuery 1.10.2。

  $.ajax({
    type: 'POST',
    url: 'https://blahblahblah.edu/AstraDev/Logon.ashx',
    data: "{username: '', password: ''}",
    contentType: 'text/json',

    xhrFields: {
      withCredentials: false 
    },

    headers: {
    },

    success: function(response) {
      console.log(response);
    },

    error: function(response) {
      console.log(response);
    }
  });

与API GET请求非常相似的代码

  $.ajax({
    type: 'GET',
    url: 'https://blahblahblah.edu/AstraDev/~api/query/room',
    data: {fields: "Id"},
    contentType: 'application/json; charset=utf-8',
    xhrFields: {
      withCredentials: true 
    },
    headers: {
    },
    success: function(response) {
      console.log(response)
    },
    error: function(response) {
      console.log(response)
    }
  });

如果我将GET的内容类型更改为不预检(例如“text / plain”),则请求失败。但如果我做任何预检,那么预检就会挂起。

这是相关的服务器配置。我正在使用IIS 7.5。

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://localhost:8888" />
       <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
       <add name="Access-Control-Allow-Headers" value="Content-Type" />
       <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
</httpProtocol>

CORS对我来说很新鲜。所以也许我错过了一些明显的东西。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

没有看到响应标头可能有很多原因。但这是我在处理PreFlight问题时发现的。这是一个在预检检查后处理json体的JavaScript示例。最初的xhr.open与teamviewer服务器进行预检检查。您只需根据需要发送最少的请求标头以满足预检。当预检通过时,json身体被发送。

 function createsession(groupid, meetwith) {

   var xhr = new XMLHttpRequest();
   var url = 'https://webapi.teamviewer.com/api/v1/sessions';
   var jbody = JSON.stringify({"groupid": groupid,
                               "description": "Global Manager Intervention",
                               "end_customer": { "name": "" + meetwith + "" }
                            });

   callTVAPI();

   function callTVAPI() {
      if (xhr) {
         xhr.open('POST', url, true);
         xhr.setRequestHeader('Content-Type', 'application/json');
         xhr.setRequestHeader('Authorization', 'Bearer @(ViewBag.TeamViewerToken)');
         xhr.onreadystatechange = function () {
            if (xhr.readyState !== XMLHttpRequest.DONE) {
                return;
            }
            if (xhr.status !== 200) {
                return;
            }
        
           var data = jQuery.parseJSON(xhr.response);
           alertify.success("Launching: " + data.supporter_link);
           
     };
     xhr.send(jbody);
   }
  }
 }