从 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 方法的主要内容,如果未能解决你的问题,请参考以下文章

简单明了区分IE,Firefox,chrome主流浏览器

Python+Selenium基础篇之3-打开和关闭IE/Chrome浏览器

IE/Firefox/Chrome等浏览器保存Cookie的位置

兼容ie8,firefox,chrome浏览器的代码片段

c#Winform有能支持IE,Firefox,Chrome,Safari浏览器的控件吗

AJAX 2