现在的JQuery中$.ajax方法支持跨域读取json数据了,原理是利用一个叫做jsonp的概念。当然,究其本质还是通过script标签动态加载js,似乎这是实现真正跨域的好方法。
$.ajax的用法JQuery手册已经写得很详细,参考手册就可以了,很简单。需要指出的一点是$.ajax利用的jsonp需要客户端与服务端作出配合。
先整理几种之前尝试过但是失败的方案吧!
- 方案一:我尝试过自己写一个Ajax函数去请求WebService,JavaScript代码没有报错.但是回调函数没有执行,证明服务器(IIS)没有响应,我用了个手段测试下是否有请求到该WebService,在其初始化时,创建一个txt文件,写入任意数据表示它请求到,然后在其方法内也做了个类似手段测试,结果证明自己写的Ajax函数并没有请求WebService,为什么?我也不清楚,如果有碰到过这样情况的朋友并且已经解决的请告知我,谢谢.
- 方案二:我刚开始的时候,以为是IIS的环境或权限问题,我改为Visual Studio测试环境发布该WebService,结果一样,没有请求.
- 方案三:上Google查了很多资料,包括MSDN,cnblogs,JQuery等官方示例,但是官方示例只给了片段,代码不完全,而且他们url地址填的是本地地址,而不是远程(网络)地址,甚至不同的资料上其$.ajax函数内的格式有不同的写法,都试过了,失败告终.
- 方案四:后来看到有人说我的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="帐 号" 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 的实现方法 在现代Web开发中,跨域问题是一个常见的挑战,尤其是在涉及不同源的服务交互时。本文将详细解释如何利用jQuery通过JSONP(JSON with Padding)的方式实现跨域调用...
摘要:Ajax 在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略 (SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制。在本文中,将学习如何克服合作限制。本文以asmx方式搭建webservice作为测试用...
6. **跨域请求(CORS)**:如果jQuery请求的WebService不在同一域名下,需要考虑跨域问题。服务器端需要配置允许跨域请求,而jQuery可以通过设置`xhrFields: {withCredentials: true}`启用跨域带cookie的请求。 7. **...
在.NET开发环境中,jQuery是一个广泛使用的JavaScript库,用于在客户端进行高效的DOM操作、事件处理以及Ajax交互。而Web服务(Webservice)则是提供跨平台、跨语言的数据交换能力。本教程将通过一个简单的示例来讲解...
调用WebService时要考虑跨域问题,可能需要启用服务器端的CORS(跨源资源共享)。同时,优化Ajax请求,如使用缓存、设置超时等,可以提高性能和用户体验。 7. 开发工具与调试: 使用浏览器的开发者工具(如Chrome...
标题中的“Ajax请求WebService跨域问题的解决方案”指的是在Web开发中,当使用Ajax技术尝试从一个域名(源)向另一个域名(目标)的WebService发送请求时,由于浏览器的同源策略限制,会遇到跨域问题。同源策略是...
5. **调用方法**:在客户端,使用jQuery或者其他JavaScript库(如axios或fetch)的Ajax方法来调用WebService.asmx中的方法。需要指定URL、请求类型、数据格式(JSON或XML)等参数,并在回调函数中处理返回的结果。 ...
如果jQuery应用和WebService不在同一个域下,会遇到跨域问题。这时可以使用JSONP(JSON with Padding)技术。JSONP通过动态插入`<script>`标签实现跨域,jQuery提供了`$.getJSON()`或在`$.ajax()`中设置`jsonp`参数...
本篇文章将详细讲解如何利用jQuery的jsonp方法实现Ajax跨域请求,以及如何在服务器端使用.Net的*.handler和WebService来返回JSON数据。 首先,理解JSONP的基本原理。JSONP是一种非官方的协议,通过动态创建`...
第三步是在HTML页面中通过JavaScript调用WebService接口,这里使用了jQuery的ajax方法来发起跨域的GET请求。在请求中指定了 dataType为"jsonp",并通过jsonp属性指定回调函数的名称,从而实现了跨域调用。当异步请求...
【跨域WebService请求】在现代Web开发中,由于浏览器的安全策略限制,JavaScript通常不能发起对不同源的HTTP请求,这被称为跨域问题。对于GET请求,可以通过JSONP(JSON with Padding)来解决,但POST请求则更为复杂...
本文将深入探讨如何使用jQuery的Ajax方法来调用WebService,从而实现异步数据交换,提升用户体验。 首先,理解Ajax(Asynchronous JavaScript and XML)的核心概念是关键。Ajax允许网页在不刷新整个页面的情况下与...
**jQuery调用WebService详解** 在Web开发中,前端与后端的数据交互是不可或缺的一部分。jQuery,作为一个轻量级、功能丰富的JavaScript库,提供了方便快捷的方式来处理这种交互,特别是在调用Web服务(WebService)...
通过这个例子,我们可以学习到如何使用 jQuery 跨域调用 ASP.NET WebService,传递参数,接收并处理返回的各种类型的数据,包括基本类型、数组、自定义对象以及数据集。这些技巧在开发富客户端应用时非常实用,特别...
【标题】"Ajax跨域请求调用WebService接口"是一个关键的技术点,主要涉及到Web开发中的异步数据交互和跨域安全策略。在Web应用程序中,Ajax(Asynchronous JavaScript and XML)技术允许我们在不刷新整个页面的情况...
**jQuery调用Web服务概述** 在Web开发中,前端与后端的数据交互是必不可少的,jQuery作为一款轻量级的JavaScript库,提供了丰富的API来简化这一过程。本篇将深入探讨如何使用jQuery调用Web服务,特别是Web Service...
"JqCrossDomain"这个文件名可能指的是使用jQuery库来处理跨域请求,因为jQuery提供了一些方便的方法来简化这个过程。 首先,了解同源策略是理解跨域调用的前提。同源策略是浏览器为了保护用户安全而实施的一项安全...
标题中的“ajax跨域调用webservice的实现代码”指的是使用AJAX技术在JavaScript中跨域请求Web服务(webservice)的方法。AJAX允许在不刷新整个页面的情况下与服务器进行异步通信,而Web服务则提供了接口供客户端应用...
如果WebService不支持跨域,可能需要在服务器端设置CORS策略或使用JSONP等技术。 总的来说,JavaScript调用WebService涉及到网络通信、XML处理和SOAP协议理解等多个方面。通过以上介绍,希望开发者能够更好地理解和...