【问题标题】:AJAX get cross-domain with WCF leads to parseerrorAJAX 使用 WCF 跨域导致 parseerror
【发布时间】:2015-03-14 00:31:35
【问题描述】:

我正在尝试使用 $.ajax 从 javascript 使用 WCF Rest 服务,我知道跨域调用存在问题。在谷歌上搜索了一天多之后,我已经走了很远,但最后一英里不见了。

首先,这是我的客户端代码:

$.ajax({
  url: "https://myurl-here/api/test?param1=x&param2=y&callback=?",
  type: 'GET',
  dataType: 'json',
  headers: {
    "Authorization": "Basic xxxxxxxxx"
  },
  success: function(data) {
    alert(data);
  },
  error: function(data, errorThrown) {
    alert(errorThrown);
  }
});

请注意,我添加了callback=? 参数并设置了dataType='json'。我正在使用 Chrome 进行调试,它有一些强大的工具。服务器的响应是200 OK。但是,我收到一条错误消息:

Uncaught SyntaxError: Unexpected token :

在谷歌搜索了一些之后,我认为这个错误可能是因为服务器响应设置为内容类型“application/json”,而客户端需要“application/javascript”。以下是调试工具返回的内容:

如果我点击它并转到响应选项卡,我什至会从响应中看到纯 json 字符串,这是正确的,正是我想要的。

现在我的问题是:我能做什么?有没有办法告诉 ajax 我不期望脚本,但它应该只获取内容并将其解析为纯 json?或者有没有办法忽略解析错误并在之后获取内容? chrome 调试器工具似乎以某种方式获取了内容。

或者有没有办法完全摆脱这个回调=?我怀疑这会使 contentType 变为 jsonp(我不完全确定这一切是如何工作的)。

我也可以在服务器端更改代码,但是有一些限制:服务器端代码不能托管在 IIS 中,它是一个自托管的 WCF 服务。

【问题讨论】:

  • 您确定您调用的端点正在返回 JSONP 格式的数据吗?
  • 返回的不是jsonp格式的数据,而是纯json字符串
  • 您从哪里获得意外令牌?如果您获得 JSON 和 HTTP 200,则可能是处理 JSON 时出现了一些错误。请务必使用 JSON.parse() 将其转换为 JSON。
  • 上面的代码sn-p进入了“error”方法。所以我想 JSON.parse 发生在 ajax 的底层。而且我想它不会做一个简单的 JSON.parse 而是一个 eval(result),因为这个回调=?我怀疑将 dataType 更改为 jsonp。
  • 你看错函数返回的数据了吗?尝试:错误:函数(xhr,ajaxOptions,抛出错误){警报(抛出错误);警报(xhr.responseText); }

标签: javascript jquery ajax json wcf


【解决方案1】:

你应该尝试使用:

dataType: 'jsonp'

并删除

&callback=?

来自 URL。

更新:

更新

在收到响应后,Jquery 会尝试验证响应是否包含有效的 JSON。如果响应不是有效的 JSON,您将收到解析错误。

  • 如果您使用 dataType : 'json' 并且响应包含像 callback({ /* ... */ }) 这样的回调,它将失败,因为回调不是有效的 JSON。
  • 如果您使用 dataType : 'jsonp' jquery 将首先调用回调,然后验证 JSON。

您可以尝试使用 jsonlint.com 之类的验证工具来确保返回的 JSON 有效。如果要阻止 Jquery 验证响应,可以在服务器端将响应内容类型设置为文本。在 clinet 端,并在 jquery AJAX 调用中使用 contentType : 'text'。在 success 回调中,使用 JavaScript function JSON.parse(text) 将响应文本转换为 JSON。

如果您希望 WCF 服务支持 CORS,则需要添加 JSONP 支持或enable CORS。如果您决定启用 CORS,您将需要 Jquery ajax 设置 crossDomain。

希望对你有帮助!

【讨论】:

  • 我试过了,它会导致完全相同的行为。我假设 dataType: 'jsonp' 和 &callback=?不知何故是一回事 - 这是我在研究期间读到的东西
  • 解析错误是因为在收到响应后 Jquery 尝试验证响应是否包含有效的 JSON。如果您使用 dataType : 'json' 并且响应包含像 callback({ /* ... */ }) 这样的回调,它将失败,因为回调不是有效的 JSON。如果您使用dataType : 'jsonp',jquery 将首先调用回调,然后验证 JSON。尝试使用jsonlint.com之类的验证工具来确保返回的JSON是有效的。
  • 返回的 json 字符串是有效的(用 jsonlint.com 验证)响应不包含这个回调({...}),它包含一个普通的 json 字符串 - 是否不可能以某种方式拦截响应并自己解析?
  • 问题是,如果您希望您的服务支持 CORS,您将需要添加 JSONP 支持或启用 CORS (enable-cors.org/server_wcf.html)。启用 CORS 后,您可以返回 json 并将响应内容类型设置为文本。然后在 Jquery 中使用 contentType : 'text' 并在 success 中使用 JavaScript 函数 JSON.parse(text) 将响应文本转换为 JSON。如果您决定启用 CORS,您将需要 Jquery ajax 设置 crossDomain
  • 启用 CORS 似乎比将 jsonp 返回给我要好得多。我将尝试 enable-cors.org 上的教程
猜你喜欢
  • 2013-05-05
  • 2011-12-30
  • 1970-01-01
  • 2017-03-31
  • 2012-12-24
  • 2012-06-05
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多