AJAX通过WCF获得跨域导致解析错误

时间:2015-03-13 09:50:37

标签: javascript jquery ajax json wcf

我正在尝试使用$ .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:意外的令牌:

在谷歌搜索之后,我认为这个错误可能是因为服务器respose被设置为content-type" application / json"并且客户期望" application / javascript"。以下是调试工具返回的内容:

200 OK

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

现在我的问题是:我该怎么办?有没有办法告诉ajax我不期望一个脚本,但它应该只采取内容并解析为普通的json?或者有没有办法忽略解析错误并在之后获取内容? Chrome调试器工具似乎以某种方式掌握了内容。

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

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

1 个答案:

答案 0 :(得分:2)

你应该尝试使用:

dataType: 'jsonp'

并删除

&callback=?

来自网址。

更新

<强>更新

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

  • 如果您使用dataType:'json'并且响应包含回调({/ * ... * /}),它将失败,因为回调不被视为有效的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。

希望它有所帮助!