今天耗费大约1天时间折腾异步提交,刚开始没有意识到是跨域访问造成的,后来跟踪了代码,发现请求根本没有发出去,debug发现是权限错误,才意识到跨域访问数据了。 因为JQuery跨域访问是一个很头疼的问题,后来想用弹出窗口,关闭窗口的时候刷新父页面这个方法实现,同样遇到跨域刷新父页面报权限错误。
也 许会有人问,为什么要跨域?因为我需要在一个ASP模块中的一个页面新增一个链接,点击链接的时候调用SOA接口并返回操作结果,刷新当前页面。但是这个 模块是ASP的,我实在不想再增加ASP中的功能,所以打算用C#代码调用SOA,然后用Ajax调用C#程序得到操作结果,但是悲剧的是跨域调用的问题 出现了,两个应用程序不在一个域名下面,公司有一堆扯淡的规范,这个我们必须遵守,最后我甚至想用ASP调用SOA返回结果(尽管非常不想这样做),抱着 一点点希望开始百度JQuery跨域的问题,结果百度相当不靠谱,因为很多人都是看到别人的答案也不管正确不正确,直接转载,在这里要狠狠的鄙视这些不负 责任的作者。无奈之下研究jsonp数据格式,最终成功了,现在分享一下,供以后有跨域异步调用的同学参考,代码如下:
怎么算是跨域:
1:域名不一致
2:域名一直,端口不一致
3:一个程序用域名,一个程序用IP
4:以后再补充
客户端
<script src="../../../js/jquery-1.6.1-min.js" type="text/javascript"></script> <script type="text/javascript"> function ProcessFlightAgency(orderid) { var url = "Http://www.a.com"; //需要访问的域名
url += "/virtualPath/controller/action?eid=yujh&orderid="+orderid;//拼接请求地址
$.ajax({ async:false, url: url, type: "GET",//跨域调用只能Get,Post方式好像不支持 dataType: 'jsonp', jsonp: 'jsoncallback', data: null,//因为我的参数拼接在URL中了,所以这个就是Null了 timeout: 5000, success: function (data) { alert(data); location.reload(); }, error: function(xhr){ alert("请求出错(请检查网络状况.)"); } }); } </script>
服务器端的代码片段:
/// <summary> /// 订单数据计算 /// </summary> /// <returns>操作结果</returns> public void ProcessOrder() { string resultString = string.Empty; string jsonFlag = Request.QueryString["jsoncallback"]; //这个参数是要原样返回的,其实就是客户端回调方法标识,客户端代码中的:jsonp: 'jsoncallback',就是这个参数 try {
int orderid = default(int); string eid = Request.QueryString["eid"]; int result = -8; if (int.TryParse(Request.QueryString["orderID"], out orderid)) { result = ModifyOrder.ProcessOrder(orderid, eid); }
switch (result) { case -9: resultString="订单查询失败"; break; case -8: resultString="参数错误"; break; case 0: resultString="操作成功"; break; default: resultString="未知错误"; break; }
} catch (Exception ex) { resultString="系统异常!"; } Response.Write(jsonFlag + "('" + resultString + "')"); //因为我是返回一个string字符串,所以可以这么写,如果要返回json格式的话,需要把resultString改为要返回的Json数据格式即可 }
代码就这么多了,希望对大家有用,也是为了自己以后方便使用。
|