XMLHttpRequest无法使用jQuery加载URL

我试图从一个“远程”网站获取一些JSON数据。 我在99000端口上运行我的Web服务,然后在99001端口上启动我的网站(http:// localhost:99001 / index.html)。

我收到以下消息:

XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons. Origin http://localhost:99001 is not allowed by Access-Control-Allow-Origin. 

即使如我启动我的网页作为一个HTML文件,我得到这个:

  XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons.Origin null is not allowed by Access-Control-Allow-Origin. 

Web服务返回数据。 我试图捕捉这样的数据项:

 var url = "http://localhost:99000/Services.svc/ReturnPersons"; $.getJSON(url, function (data) { success: readData(data) }); function readData(data) { alert(data[0].FirstName); } 

我试图得到这个结构:

 [{"FirstName":"Foo","LastName":"Bar"},{"Hello":"Foo","LastName":"World"}] 

你知道为什么我得到这个错误吗?

你不能做一个XMLHttpRequest跨域,唯一的“选项”将是一种叫做JSONP的技术,它归结为:

要开始请求:添加一个新的<script>标记与远程URL,然后确保远程URL返回一个有效的JavaScript文件,调用您的callback函数。 一些服务支持这个(并且让你在GET参数中命名你的callback)。

另一个简单的方法是,在本地服务器上创build一个“代理”,该代理获取远程请求,然后将其“转发”回到您的javascript。

编辑/添加:

我看到jQuery已经内置了对JSONP的支持,通过检查URL是否包含“callback =?” (jQuery将用实际的callback方法replace?)。 但是,您仍然需要在远程服务器上处理该消息以生成有效的响应。

在新的jQuery 1.5中,您可以使用:

 $.ajax({ type: "GET", url: "http://localhost:99000/Services.svc/ReturnPersons", dataType: "jsonp", success: readData(data), error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(thrownError); } }) 

摆弄3个工作解决scheme

给定一个外部的JSON:

 myurl = 'http://wikidata.org/w/api.php?action=wbgetentities&sites=frwiki&titles=France&languages=zh-hans|zh-hant|fr&props=sitelinks|labels|aliases|descriptions&format=json' 

解决scheme1:$ .ajax()+ jsonp:

 $.ajax({ dataType: "jsonp", url: myurl , }).done(function ( data ) { // do my stuff }); 

解决scheme2:$ .ajax()+ json +&calback = ?:

 $.ajax({ dataType: "json", url: myurl + '&callback=?', }).done(function ( data ) { // do my stuff }); 

解决scheme3:$ .getJSON()+ calback = ?:

 $.getJSON( myurl + '&callback=?', function(data) { // do my stuff }); 

文档: http : //api.jquery.com/jQuery.ajax/,http : //api.jquery.com/jQuery.getJSON/

find一个可能的解决办法,我不相信被提及。

这是一个很好的问题描述: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

基本上只要你使用表单/url编码/纯文本内容types,你很好。

 $.ajax({ type: "POST", headers: { 'Accept': 'application/json', 'Content-Type': 'text/plain' }, dataType: "json", url: "http://localhost/endpoint", data: JSON.stringify({'DataToPost': 123}), success: function (data) { alert(JSON.stringify(data)); } }); 

我用它与ASP.NET WebAPI2。 所以在另一端:

 public static void RegisterWebApi(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); } 

这样Json格式化程序在parsing纯文本内容types时得到了使用。

在Web.config中不要忘记:

 <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST" /> </customHeaders> </httpProtocol> 

希望这可以帮助。

我正在使用WebAPI 3并面临同样的问题。 这个问题已经解决了@Rytis增加了他的解决scheme。 我想在WebAPI 3中,我们不需要定义RegisterWebApi方法。

我的更改只在web.config文件中,并正在工作。

 <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST" /> </customHeaders> </httpProtocol> 

感谢您的解决scheme@Rytis!