Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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
C# 为什么我的RESTAPI客户端需要JSONP请求?_C#_Jquery_Asp.net Web Api_Jsonp - Fatal编程技术网

C# 为什么我的RESTAPI客户端需要JSONP请求?

C# 为什么我的RESTAPI客户端需要JSONP请求?,c#,jquery,asp.net-web-api,jsonp,C#,Jquery,Asp.net Web Api,Jsonp,我在MVC4中创建了REST-BaseWebAPI,当我从其他域上的HTML调用它时,我托管在服务器上,在我的本地pc上,我需要将它作为JSONP请求调用,比如put callback=?在url中,所以它可以是jsonp。我的问题是为什么会这样?如果是因为跨域的原因,那么google、facbook和其他公司是如何托管他们的api的,我们也会从自己的域调用它,但我们不保留callback=?在他们的url中 那么为什么我的API需要callback=?在url中,如果我从其他域或在本地pc上使

我在MVC4中创建了REST-BaseWebAPI,当我从其他域上的HTML调用它时,我托管在服务器上,在我的本地pc上,我需要将它作为JSONP请求调用,比如put callback=?在url中,所以它可以是jsonp。我的问题是为什么会这样?如果是因为跨域的原因,那么google、facbook和其他公司是如何托管他们的api的,我们也会从自己的域调用它,但我们不保留callback=?在他们的url中


那么为什么我的API需要callback=?在url中,如果我从其他域或在本地pc上使用简单jquery html调用它。

因为同源策略限制。同源策略防止从一个域加载的脚本从另一个域获取或操作文档的属性。也就是说,请求URL的域必须与当前网页的域相同。这基本上意味着浏览器将不同来源的内容隔离开来,以防止它们被操纵

这是因为浏览器强制的同源策略。 看见

。 还要注意,CORS在未来可能是比JSONP更好的选择

编辑:------------

如果您浏览了上面的链接,您会看到JSONP允许用户绕过浏览器强加的同一来源策略安全措施

诀窍是浏览器允许标记引用源以外的其他域中的文件

基本上,使用JSONP时,将回调函数名附加到查询字符串后发送到服务器。然后服务器将通过调用此函数来填充或前缀它的JSON请求,因此名称中表示响应的P将被填充或前缀

例如,您可以创建一个脚本标记,如

然后,目标服务器应发送响应,以便

mymethod({normal: 'json response'})
当在客户端对这个repsone进行评估时(对于任何其他javascript文件),它将使用来自该服务器的JSON响应有效地调用您的方法

但是,这只能执行GET请求

如果您想发出POST(PUT/DELETE)请求,您需要使用CORS,服务器需要在CORS中预先设置一个特定的头

Access-Control-Allow-Origin: www.ext.site.com

希望这能有所帮助。

用户无法理解的是,跨站点脚本存在一个问题,而是在寻找一个可行的解决方案,它如何适用于其他人。例如,我们使用jquery调用twitter api来获取推文。。。所以为什么我不能在我的域上托管,其他用户可以使用我的api获取一些信息/数据呢。