Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WCF REST与jQueryAjax-删除/处理同一来源策略_Javascript_Jquery_Ajax_Rest_Cross Domain - Fatal编程技术网

Javascript WCF REST与jQueryAjax-删除/处理同一来源策略

Javascript WCF REST与jQueryAjax-删除/处理同一来源策略,javascript,jquery,ajax,rest,cross-domain,Javascript,Jquery,Ajax,Rest,Cross Domain,因此,我试图创建一个由jQuery调用的C#WCF REST服务。我发现jQuery要求AJAX调用在同源策略下进行。我有几个问题要问我如何继续 我已经意识到 1.带有服务器回调的JSONP黑客解决方案 2.使用跨域代理会导致服务器开销过大。 3.在浏览器中使用Flash拨打电话,并在我的WCF服务器根目录下设置crossdomain.xml 我宁愿不使用这些,因为 1.我不想使用JSON,或者至少我不想被限制使用它 2.我想将服务静态页面的服务器与服务应用程序状态的服务器分开。 3.在这个时代

因此,我试图创建一个由jQuery调用的C#WCF REST服务。我发现jQuery要求AJAX调用在同源策略下进行。我有几个问题要问我如何继续

我已经意识到
1.带有服务器回调的JSONP黑客解决方案
2.使用跨域代理会导致服务器开销过大。
3.在浏览器中使用Flash拨打电话,并在我的WCF服务器根目录下设置crossdomain.xml

我宁愿不使用这些,因为
1.我不想使用JSON,或者至少我不想被限制使用它
2.我想将服务静态页面的服务器与服务应用程序状态的服务器分开。
3.在这个时代,闪光是不可能的。

我在想:是否有类似Flash的crossdomain.xml文件的东西可以用于jQuery?这个“同源”策略是jQuery的一部分还是特定浏览器中的一个限制?如果它只是jQuery的一部分,也许我会尝试挖掘代码来解决它





编辑:
斯莱德把它看得非常准确,见下文。为了在C#中实现这一点,我创建了以下方法,您的所有服务方法都需要调用该方法:

private void BypassCrossDomain()
{
  WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
}
需要注意的是,这允许跨站点脚本攻击,并且在需要随请求发送第三方cookie时,也不能使用“*”。

不幸的是,同源策略是对浏览器的限制,而不是jQuery的明确部分,因此我怀疑您是否能找到解决方法

我建议您最好坚持使用JSONP解决方案。是的,你可以说是“黑客”,但这是一个被广泛接受的“黑客”,原因正是你遇到的(即,它是唯一可行的选择之一)


至于限制使用JSON,如果您控制服务调用的两端,那么没有理由不能使用JSONP样式的使用模式,而不是实际使用JSON。。。您的服务器响应将被传递到客户端的JavaScript函数,因此,没有什么可以阻止您返回字符串中的XML&然后让回调解析并处理它(尽管,这可能会将您推向真正的“黑客”领域)

您也可以考虑吐出一个额外的HTTP报头,它将启用Web服务上的跨域请求。

这里描述了这一点:

因此,如果将以下标题添加到web服务提供的任何内容中:

Access-Control-Allow-Origin: *

浏览器将允许对该web服务的跨域请求。这在大多数现代浏览器(ff 3.5、IE 8、safari 4)中都得到了支持,而且对于托管在domain foo.com上的jquery应用程序来说,它似乎工作得非常好,可以对bar.com进行两天的ajax调用,最后我发现了这一点!比你想象的还要多

因为我的WCF应用程序是自托管的(将xml添加到app.config和web.config没有帮助),但这是可行的

private void BypassCrossDomain()
{
  WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-      Origin", "*");
}
--不适用于自托管:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin"
             value="*" />
      </customHeaders>
    </httpProtocol>
</system.webServer>


很公平。如果它被编码到浏览器中,我想这就是我所坚持的。看下面,这是如何做到的。没有jsonp。适用于xml数据和json dataFYI访问控制允许源代码=*允许跨站点脚本。如果需要随请求发送cookies,也不能执行“*”。如果需要的话,我可以进一步扩展。