`
wfdoublext
  • 浏览: 126434 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

转载:jquery webservice 跨域

 
阅读更多

现在的JQuery中$.ajax方法支持跨域读取json数据了,原理是利用一个叫做jsonp的概念。当然,究其本质还是通过script标签动态加载js,似乎这是实现真正跨域的好方法。

$.ajax的用法JQuery手册已经写得很详细,参考手册就可以了,很简单。需要指出的一点是$.ajax利用的jsonp需要客户端与服务端作出配合。

 

先整理几种之前尝试过但是失败的方案吧!

  1. 方案一:我尝试过自己写一个Ajax函数去请求WebService,JavaScript代码没有报错.但是回调函数没有执行,证明服务器(IIS)没有响应,我用了个手段测试下是否有请求到该WebService,在其初始化时,创建一个txt文件,写入任意数据表示它请求到,然后在其方法内也做了个类似手段测试,结果证明自己写的Ajax函数并没有请求WebService,为什么?我也不清楚,如果有碰到过这样情况的朋友并且已经解决的请告知我,谢谢.
  2. 方案二:我刚开始的时候,以为是IIS的环境或权限问题,我改为Visual Studio测试环境发布该WebService,结果一样,没有请求.
  3. 方案三:上Google查了很多资料,包括MSDN,cnblogs,JQuery等官方示例,但是官方示例只给了片段,代码不完全,而且他们url地址填的是本地地址,而不是远程(网络)地址,甚至不同的资料上其$.ajax函数内的格式有不同的写法,都试过了,失败告终.
  4. 方案四:后来看到有人说我的WebService没有加上类特性[System.Web.Script.Services.ScriptService]以及方法特性[System.Web.Script.Services.ScriptMethod],我很纳闷,这远程访问(跨域调用)跟这特性有什么关系?不过我还是照做,加了上去,事实证明,一点意义都没有.

 

成功方案:

其成功解决问题的几个重要因素如下:

1.       由于WebService默认不支持Get请求,所以要在Web.config配置文件内的<system.web>节点内添加如下元素:

复制代码
1 <system.web>
2 <webServices>
3         <protocols>
4           <add name="HttpGet"/>
5           <add name="HttpPost"/>
6         </protocols>
7 </webServices>
8 </system.web>
复制代码

有些网友没有在这里问,而是通过QQ问我问题。

我在帮他们远程调试的时候,没注意看,后来才发现原来问题是他们把这段配置放在客户端程序,而不是web service服务程序。郁闷..

在此强调下:是放在web service网站的web.config里面,而不是放在客户端程序的web.config里。

 

2.       在请求的URL加参数jsoncallback=?,注意这里jsoncallback=?是关键所在!其中?符号会被JQuery自动替换成其它的回调方法名称,具体过程和原理我们这里不予理会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回。

 

3.       设置dataType类型为”jsonp”

 

WebService代码如下:

复制代码
 1 using System.Web;
 2 using System.Web.Services;
 3 /// <summary>
 4 ///UserService 的摘要说明
 5 /// </summary>
 6 [WebService(Namespace = "http://tempuri.org/")]
 7 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 8 public class UserService : System.Web.Services.WebService
 9 { 
10     [WebMethod]
11     public void GetLoginId(string loginId)
12     {
13         string callback = HttpContext.Current.Request["jsoncallback"];
14         bool bl= true;//这是我调用业务逻辑层(BLL)的一个方法
15                               //返回一个布尔(boolean)值
16                               //现在我省略掉,直接赋值true
17         HttpContext.Current.Response.Write(callback +
18             "({result:'" + bl + "'})");
19         //关于result这词是你自己自定义的属性
20         //会作为回调参数的属性供你调用结果
21         HttpContext.Current.Response.End();
22     }
23 }
复制代码

aspx页面及javascript脚本代码如下:

复制代码
 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2  
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5 <head runat="server">
 6     <title>测试</title>
 7     <script type="text/javascript" src="Scripts/jquery-1.7.2.js"></script>
 8     <script type="text/javascript">
 9         //Document加载完毕后初始化方法
10         $(function Init() {
11             $("#TxtLoginId").bind("blur", CkLoginId);
12         }); 
13         //帐号验证及提示
14         function CkLoginId() {
15             var Id = $("#TxtLoginId");
16             $.ajax({
17                 url: "http://localhost:5311/UserService.asmx/GetLoginId?jsoncallback=?",
18                 dataType:"jsonp",
19                 data:{"loginId":Id.val()},
20                 success:OnSuccess,
21                 error:OnError
22             });
23         }
24         function OnSuccess(json) {
25             alert(json.result);
26         }
27         function OnError(XMLHttpRequest, textStatus, errorThrown) {
28             targetDiv = $("#data");
29             if (errorThrown || textStatus == "error" || textStatus == "parsererror" || textStatus == "notmodified") {
30                 targetDiv.replaceWith("请求数据时发生错误!");
31                 return;
32             }
33             if (textStatus == "timeout") {
34                 targetDiv.replaceWith("请求数据超时!");
35                 return;
36             }
37         }  
38     </script>
39 </head>
40 <body>
41     <form id="form1" runat="server">
42     <table border="0" cellspacing="0" cellpadding="0" width="100%">
43         <tr>
44             <td>
45                 <asp:Label ID="LblLoginId" runat="server" Text="帐&nbsp;&nbsp;号" ClientIDMode="Static"></asp:Label>
46                 <asp:TextBox ID="TxtLoginId" runat="server" ClientIDMode="Static"></asp:TextBox>
47             </td>
48         </tr>
49     </table>
50     </form>
51 </body>
52 </html>
复制代码
分享到:
评论

相关推荐

    jquery跨域调用webservice

    jquery跨域调用webservice,采用jsonp,在webservice返回端采用HttpContext.Current.Response.Write返回json格式。,回调函数返回执行结果。

    Jquery Ajax 跨域调用asmx类型 WebService范例代码

    摘要:Ajax 在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略 (SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制。在本文中,将学习如何克服合作限制。本文以asmx方式搭建webservice作为测试用...

    Ajax请求WebService跨域问题的解决方案

     用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2、出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容); 3、解决方案: (1) JSONP:只支持GET方式 (2) CROS:...

    利用JQuery jsonp实现Ajax跨域请求json数据

    利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据

    JS调用WebService.zip

    1,为什么要拦截soap协议文本呢? 因为要通过js或urlConnection调用服务器提供的方法。需要使用soap协议文本。 2,我们可以通过js和...因为对于jQuery来说,限制跨域访问。跨域是指两个服务器之间的访问。

    JSONP跨域GET请求解决Ajax跨域访问问题

    前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息。实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应...

    JSONP解决跨域问题

    前端使用jquery,datatype采用jsonp,服务端采用C#编写的webService

    前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)

    项目背景:.Net 3.5+MySQL+jQuery+WebService 在公司做这个项目已经6个多月了,总结一些问题,也算是抛砖引玉吧,希望园子里更多的朋友一起分享一些技巧。 1、 WebService方法返回值不能为void。 当WebService方法...

    Suds:用于JavaScript的轻量级SOAP客户端库(我不再支持)

    在通常的跨域限制下,Suds也应针对SOAP Web服务在Web浏览器中运行。 但是,尚未在浏览器中测试Suds,因此您的行驶里程可能会有所不同。 注意:在示例应用程序中使用jQuery 1.3时,Suds并不依赖于它,可以独立使用。...

    浅析JSONP解决Ajax跨域访问问题的思路详解

    前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息。实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应...

Global site tag (gtag.js) - Google Analytics