Breeze 错误消息“;”在 Chrome 中状态为 OK

Posted

技术标签:

【中文标题】Breeze 错误消息“;”在 Chrome 中状态为 OK【英文标题】:Breeze Error message "; " with status OK in Chrome 【发布时间】:2015-06-05 03:24:54 【问题描述】:

我在 WebAPI 中使用 CORS 支持并从 EntityManager 获得一个奇怪的结果集,即使我从服务器获得状态代码 200 和数据。响应得到

错误信息是(截断的):

message: "; ", statusText: "OK", status: 200, url:"http://localhost:61808/odata/Servers?$filter=Id%20gt%2080&$top=20&$expand=Owner%2CApplications"

我的数据上下文:

(function () 
  angular.module('App').factory('datacontext', datacontext);

  datacontext.$inject = ['EntityManagerFactory'];

  function datacontext(EntityManagerFactory) 
    var EntityQuery = breeze.EntityQuery;
    var Manager = EntityManagerFactory.newManager();

return 
  getServers: getServers
;

function getServers() 
  return EntityQuery
    .from('Servers')
    .expand('owner, applications')
    .where('id', 'gt', 80)
    .take(20)
    .toType('server')
    .using(Manager)
    .noTracking()
    .execute()
    .then(success)
    .catch(error);


function success(response) 
  return response.results;


function error(error) 
  console.log(error);

我的 WebAPI web.config:

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

此代码在 Internet Explorer 中运行良好。但是,即使交付了有效负载,Chrome 也会引发错误!有什么想法吗?

【问题讨论】:

【参考方案1】:

datajs 1.1.2 的当前版本中存在一个错误,该错误在https://datajs.codeplex.com/workitem/756 的 codeplex 问题下提交。

在 datajs.js 中,将 readResponseHeaders 替换为:

var readResponseHeaders = function (xhr, headers) 
  /// <summary>Reads response headers into array.</summary>
  /// <param name="xhr" type="XMLHttpRequest">HTTP request with response available.</param>
  /// <param name="headers" type="Array">Target array to fill with name/value pairs.</param>

  var responseHeaders = xhr.getAllResponseHeaders().split(/\r?\n/);
  var i, len;

  for (i = 0, len = responseHeaders.length; i < len; i++) 
    if (responseHeaders[i]) 
      var header = responseHeaders[i].split(": ");
      headers[header[0]] = header[1];
    
  

  // Fix to handle Firefox CORS bug
  var requiredHeaders = [
    'Content-Type', 'DataServiceVersion'

    /*, 'Content-Length'
     , 'Cache-Control'
     , 'Access-Control-Expose-Headers'
     , 'X-Content-Type-Options'
     , 'Date'*/
  ];

  for (i = 0; i < requiredHeaders.length; i++) 
    if (headers[requiredHeaders[i]] === undefined &&
      xhr.getResponseHeader(requiredHeaders[i])) 
      headers[requiredHeaders[i]] = xhr.getResponseHeader(requiredHeaders[i]);
    
  
;

并在 WebAPI 的 web.config 中添加:

        <add name="Access-Control-Expose-Headers" value="DataServiceVersion" />

【讨论】:

以上是关于Breeze 错误消息“;”在 Chrome 中状态为 OK的主要内容,如果未能解决你的问题,请参考以下文章

连接到 Web API 的 Angular/Breeze 应用程序在 IE11 上引发“拒绝访问”错误

Breeze 正在尝试更新计算的数据库列

Breeze# 用于 Xamarin.Forms(UWP、Droid 和 iOS)?

Breeze executeQuery Q 承诺失败 CORS

Chrome 扩展错误“未检查的 runtime.lastError:消息端口在收到响应之前关闭”

selenium.common.exceptions.WebDriverException:消息:“chromedriver”可执行文件需要在无头 Chrome 的 PATH 错误中