从 ie/firefox/chrome 中的 jquery 调用跨域 .net 方法
Posted
技术标签:
【中文标题】从 ie/firefox/chrome 中的 jquery 调用跨域 .net 方法【英文标题】:Calling cross-domain .net-method from jquery in ie/firefox/chrome 【发布时间】:2011-09-27 16:09:53 【问题描述】:我一直在尝试通过 JQuery 从另一个域调用 .NET 方法(作为 asmx 文件和普通 aspx 文件),但我无法在每个浏览器中完成这项工作。目前它在 Firefox 中运行良好,但在 IE 中不行。
function save()
if (jQuery.browser.msie && window.XDomainRequest)
// Use XDR
var params = "'height':" + 10 + ",'width':" + 10 + ",'pos':'" + 10 + "'";
var xdr = new XDomainRequest();
xdr.onerror = alert_error;
xdr.ontimeout = alert_timeout;
xdr.onprogress = alert_progress;
xdr.onload = alert_loaded;
xdr.timeout = 10000;
xdr.open("post", 'http://domain/reciever.asmx/setdata');
//Tried as webservice and as a normal aspx page
//xdr.open("post", 'http://domain/default.aspx');
xdr.send(params);
else
var params = "pos=" + positions + "&&http://domain/default.aspx",
type: 'post',
cache: false,
crossDomain: true,
data: params
);
在服务器端 web.config 有:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
还有网络服务
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string setdata(int width, int height, string pos)
aspx页面返回:
Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.End();
提琴手 说: Fiddler 在会话 #2565 中检测到协议违规。 Content-Length mismatch: Request Header 指示 38 字节,但客户端发送了 0 字节。所以我相信它是“Access-Control-Allow-Origin”,但我已经设置了(至少据我所知)。
谁能帮我理解我做错了什么。
【问题讨论】:
您是否尝试过不通过 Fiddler 运行的请求?此知识库文章表明代理可能会导致问题:support.microsoft.com/kb/287705 【参考方案1】:出于某些安全原因,某些浏览器不允许跨域 Ajax 调用(使用 XmlHttpRequest 对象的调用)。
但是解决方案是而不是ajax调用使用JSONP调用。 JSONP 通过发出适合脚本文件的请求来避免这种情况。通过使用 JSONP,以下事情发生使跨域请求成为可能,
1.浏览器不是访问 XHR 对象,而是首先创建一个新的脚本标签以注入 HTML DOM。
2.script 标签的 URL 设置为您正在查找的 URL 以获取/发布(使用 HTTP GET)数据。
3.脚本标签被注入到页面中,导致...
4.请求发送到服务器,即使是跨域的
5.服务器以JavaScript函数调用的形式返回数据
6.浏览器接收数据并执行函数调用
请参阅下面的 url 以获取实现详细信息,
http://www.codeproject.com/Articles/78757/Making-Cross-Domain-jQuery-AJAX-Calls.aspx
http://usejquery.com/posts/9/the-jquery-cross-domain-ajax-guide
希望这对你有帮助...
【讨论】:
我今天早些时候一直在研究这种方法,但不太明白如何才能发帖而不是获取。这个方法能做到吗? 我认为不可能发出 JSONP POST 请求。 JSONP 通过创建一个从不同域执行 javascript 的 以下链接可能会帮助您通过 url 传递参数并从 web 服务中获取它们,***.com/questions/2022878/… 嗨哈伦。据我所见,JSONP 不允许您说的发布,但我需要发送 1 到 10 kb 的数据,而这无法通过 get 完成(浏览器的最大 url 长度在 512 个字符和 2000 个字符之间)。真的需要帮助,如果您有任何其他想法,请发表:) 谢谢 @Dennis,在 JQuery 1.5 及更高版本中有一个名为 crossDomain 的属性(所以下载最新的 Jquery)。将此设置为 true 并尝试。有关实现细节,请参阅 url - ***.com/questions/6316915/ajax-cross-domain-request。我不确定这一点,但请尝试一下..以上是关于从 ie/firefox/chrome 中的 jquery 调用跨域 .net 方法的主要内容,如果未能解决你的问题,请参考以下文章
Python+Selenium基础篇之3-打开和关闭IE/Chrome浏览器
IE/Firefox/Chrome等浏览器保存Cookie的位置