下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信。这里我们仅使用jQuery去连接Web Service,而不去使用ASP.Net AJAX库,至于为什么不使用AJAX库中,那是因为我们在项目中已经使用了jQuery,而它已经能处理全部的AJAX请求和所有功能,并且,如果我们 一旦使用ASP.NET AJAX库,我们也必须多包含一个超过80Kb的数据量(调试模式下会更大),但这也不是说ASP.NET AJAX库不实用,事实上,如果使用了相同的类库,我们能够少写很多的额外代码,但这个例子就是为了说明,在没有一个好的客户端代理的情况下,我们是如何调用Web服务的。
WCF 服务:
我们先创建一个WebSite,然后添加一个AJAX-enabled WCF Service,从而创建WCF服务。(请确保你使用了正确的.Net Framework 版本,我用的是3.5)

在我们添加完service后,它会自动进入该service的后置代码文件,Go ahead and browse around the file for a second.
首先我们要做的是找到"AspNetCompatibilityRequirements"并将其值置为 "Allowed":
[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )]
这个属性的设置可将我们的服务跑在ASP.NET compatibility模式,如果我们未将该值设为"Allowed",那么就无法通过ASP.Net去访问到该服务,这个属性是当你添加 "AJAX-enabled WCF Service" 时自动生成的。更多祥细请参看MSDN。
现在再来看自动生成的后置代码文件,我们能发现已经存在了一个被标注了"OperationContract"特性的"DoWork()" 的方法,这个方法是自动生成的,我们将使用这个方法来完成下面的示例。我们再来为该方法添加一个"WebGet"的特性,并设"RequestFormat" 的值为 "Json." 我们再来为该方法加上另外的一个特性RequestFormat,WebGet 和Get动词一样,作用于一个UriTemplate(本文不对此作进一步讨论),RequestFormat 特性可以让我们接收JSON格式的请求。
我们的 "DoWork()" 方法如下:
- [OperationContract]
- [WebGet( RequestFormat=WebMessageFormat.Json )]
-
public void DoWork()
- {
-
-
return;
- }
对象的模型:
我们希望通过"DoWork()" 来传递一个叫“Person”的对象,那先来创建一个Person对象写入到当前类的头部,其包含字段和属性(Name, Age 和 the types of Shoes they own),这个类同时也作为所传递JSON的结构。
- [Serializable]
-
[DataContract( Namespace = "http://www.dennydotnet.com/", Name = "Person" )]
-
public class Person
- {
-
private string _name = string.Empty;
-
private int _age = 0;
-
-
[DataMember( IsRequired = true, Name = "Name" )]
-
public string Name
- {
-
get { return _name; }
- set { _name = value; }
- }
-
-
[DataMember( IsRequired = true, Name = "Age" )]
-
public int Age
- {
-
get { return _age; }
- set { _age = value; }
- }
-
-
[DataMember( IsRequired = true, Name = "Shoes" )]
-
public List<String> Shoes;
- }
-
-
我们已经为 "Person”类的名称和命名空间标注上了契约,我们仍需要为属性授于数据成员特性,为每个属性 设置"IsRequired"并具体指定其名称。你只需要具体指定名字,如果它和属性名不一样。举例来说吧,如果你有一个属性叫作“Level”,但你在 数据成员特性中赋值为“Rank”,现在我们要回去修改我们的“DoWork()”方法,去接收Person对象作为参数。具体参下面代码块。
- [OperationContract]
- [WebGet( RequestFormat=WebMessageFormat.Json )]
-
public void DoWork(Person p)
- {
-
-
return;
- }
-
对Web.Config文件进行配置:
我们仅需对web.config文件做出很小的修改就能对服务进行访问了。首先加入一个 serviceBehavior 用来允许Http Get请求,再添加一些调试选项帮助。代码如下:
Below </endpointBehaviors>
- <serviceBehaviors>
-
<behavior name="ServiceAspNetAjaxBehavior">
-
<serviceMetadata httpGetEnabled="true" httpGetUrl="" />
-
<serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
-
</behavior>
-
</serviceBehaviors>
-
在<services>这里</services>之间,你的代码如下:
- <service name="Service" behaviorConfiguration="ServiceAspNetAjaxBehavior">
-
<endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior"
-
binding="webHttpBinding" contract="Service" />
-
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
-
</service>
-
注意:
- <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
允许例外可能会导致内部应用相关信息,包括个人信息的泄露。设置为true仅用于调试目的!
你的Web.config文件修改后如下图所示:

回到前端页面:
现在我们的服务已经被创建和配置了,再来关注前端页面部分吧(确保页面已引用jQuery.js文件),首先来创建一个简单的Json对象用于向service传递,我们在Person类结构的基础上创建该JSON对象。
- var mydata = { "Name":"Denny", "Age":23, "Shoes":["Nike","Osiris","Etnies"] };
如果你对JSON还不是很熟悉,我们可以把它看作一个对象,这个小工具帮助你来查看 (JsonViewer):

我们需要使用WCF和jQuery进行Ajax通信,下面的代码创建了一个AJAX呼叫,在头部设置了GET方式,和内容类型为 application/json,将url的路径置为WCF 服务的 svc 文件,并在其后加上/和所要执行方法的名称,在这里我们要调用的是DoWork()方法,data是用来传递参数,为了让jQuery不去自动处理我们的 数据,将processData设为false,我们还加入了对success和error的处理,以更多的了解AJAX执行完之后的处理过程。
- function sendAJAX(data) {
- $.ajax({
-
type: "GET",
-
contentType: "application/json",
-
url: "Service.svc/DoWork",
- data: data,
-
processData: false,
-
success: function(msg){
-
alert( "Data Saved!" );
- },
-
error:function(XMLHttpRequest, textStatus, errorThrown){
-
alert( "Error Occured!" );
- }
- });
- }
-
然而很不幸运,这里有一个小的问题,我们必须发送真正的JSON字符串,作为参数传递。但还没有简单的方法让JSON对象转换为字符串,如果你试了data.toString(),得到的会是一个 "[object Object]"值。这不是我们想要的。
所以在这里我们要修改方法使得它能将JSON转换成字符串。
- function json2string(strObject) {
-
var c, i, l, s = '', v, p;
-
-
switch (typeof strObject) {
-
case 'object':
-
if (strObject) {
-
if (strObject.length && typeof strObject.length == 'number') {
-
for (i = 0; i < strObject.length; ++i) {
- v = json2string(strObject[i]);
-
if (s) {
-
s += ',';
- }
- s += v;
- }
-
return '[' + s + ']';
-
} else if (typeof strObject.toString != 'undefined') {
-
for (i in strObject) {
- v = strObject[i];
-
if (typeof v != 'undefined' && typeof v != 'function') {
- v = json2string(v);
-
if (s) {
-
s += ',';
- }
-
s += json2string(i) + ':' + v;
- }
- }
-
return '{' + s + '}';
- }
- }
-
return 'null';
-
case 'number':
-
return isFinite(strObject) ? String(strObject) : 'null';
-
case 'string':
- l = strObject.length;
-
s = '"';
-
for (i = 0; i < l; i += 1) {
- c = strObject.charAt(i);
-
if (c >= ' ') {
-
if (c == '\\' || c == '"') {
-
s += '\\';
- }
- s += c;
-
} else {
-
switch (c) {
-
case '\b':
-
s += '\\b';
-
break;
-
case '\f':
-
s += '\\f';
-
break;
-
case '\n':
-
s += '\\n';
-
break;
-
case '\r':
-
s += '\\r';
-
break;
-
case '\t':
-
s += '\\t';
-
break;
-
default:
- c = c.charCodeAt();
-
s += '\\u00' + Math.floor(c / 16).toString(16) +
- (c % 16).toString(16);
- }
- }
- }
-
return s + '"';
-
case 'boolean':
-
return String(strObject);
-
default:
-
return 'null';
- }
- }
-
现在我们有一个方法可以将JSON对象转成我们所需要的字符串,现在我们回过头去修改我们之前定义的 "mydata" 变量,我们应当按下面去应用所写的json2string方法。
- var mydata = { "Name":"Denny", "Age":23, "Shoes":["Nike","Osiris","Etnies"] };
-
var jsonStr = "p=" + json2string(mydata);
注意在下面我准备了"p=" 字符在我们的JSON字符串中,“p”对应于"DoWork()" 方法中的参数,当我们将参数改名为"Dude" ( 例如DoWork(Person Dude) )时,我们也必须将此处替换为"Dude="
现在我们准备好了查询字符串,我们参看到我们如何调用服务:
- http://www.dennydotnet.com/Service.svc/DoWork/?p={ "Name":"Denny", "Age":23, "Shoes":["Nike","Osiris","Etnies"] }
你将接收到一个已经为URL编码处理过的值,如下:
- http://www.dennydotnet.com/Service.svc/DoWork/?p=%7b+%22Name%22%3a%22Denny%22%2c+%22Age%22%3a23%2c+%22Shoes%22%3a%5b%22Nike%22%2c%22Osiris%22%2c%22Etnies%22%5d+%7d%3b
紧接着我们去调用"SendAjax()" javascript 方法,现在能够调试我们的服务并验证数据是否被传递到服务。如下图

现在你仅需要在DoWork()方法里实现自己的逻辑。注意无论你如何怎么去做 在WCF的服务端,它已经为你做好了。
相关推荐
**jQuery调用WCF服务详解** 在Web开发中,jQuery是一个强大的JavaScript库,它简化了DOM操作、事件处理、动画效果以及Ajax交互。WCF(Windows Communication Foundation)是微软提供的一种面向服务的架构,用于构建...
**jQuery调用WCF服务详解** 在Web开发中,JavaScript库jQuery因其简洁高效的API而备受开发者喜爱。同时,Windows Communication Foundation(WCF)是.NET框架下用于构建分布式应用程序的服务模型。将jQuery与WCF...
在客户端,我们可以使用jQuery或原生的XMLHttpRequest对象发起AJAX请求来调用WCF服务。这里以jQuery为例: ```javascript $.ajax({ url: 'http://your-wcf-service-url/YourService', type: 'POST', data: JSON....
4. **使用jQuery调用WCF服务**: 在客户端(通常是HTML页面),我们需要引入jQuery库,并编写JavaScript代码来发送POST请求。使用jQuery的`$.ajax`或`$.post`方法可以实现: ```javascript $.ajax({ type: "POST...
总结来说,jQuery调用WCF服务的过程主要包括创建WCF服务接口和实现,设置HTTP GET请求的JSON格式,以及在客户端使用jQuery的`$.getJSON`方法发起Ajax请求。通过这种方式,你可以方便地在网页上实时展示从服务器获取...
**jQuery调用WCF服务详解** 在Web开发中,jQuery是一个强大的JavaScript库,它简化了DOM操作、事件处理以及AJAX交互。而WCF(Windows Communication Foundation)是微软推出的一种全面的服务模型,用于构建分布式...
为了通过AJAX调用WCF服务,我们需要配置服务以支持JSON或jsonp,因为这些格式更适合于前端与后台的异步通信。 **创建WCF服务** 1. 首先,创建一个新的WCF项目。在Visual Studio中,选择“文件”->“新建”->“项目...
本示例将详细介绍如何利用jQuery的AJAX方法调用WCF(Windows Communication Foundation)服务,以实现数据的无刷新交互。 首先,我们需要理解WCF服务。WCF是微软推出的一种面向服务的架构,它提供了一种统一的方式...
这个案例展示了如何使用jQuery调用WCF服务,通过AJAX实现了客户端与服务器端的异步通信。这对于创建交互式的Web应用非常有用,尤其是在需要实时更新数据或执行远程操作的情况下。了解这些技术的结合,能帮助开发者...
**jQuery调用WCF服务详解** 在Web开发中,JavaScript库jQuery因其简洁的API和强大的功能,被广泛用于客户端的交互处理。而Windows Communication Foundation(WCF)是.NET框架下的一个全面的服务模型,用于构建可互...
### jQuery Ajax调用WCF服务详细教程知识点 #### 1. WCF服务创建与配置 - 创建WCF服务应用程序项目:在Visual Studio中启动新的项目,选择WCF服务应用程序,创建服务所需的基本结构。 - 定义数据类:创建数据传输...
**五、JQuery调用WCF服务示例** 1. **JSONP**: ```javascript $.ajax({ url: 'http://otherdomain.com/Service.svc/GetData', type: 'GET', dataType: 'jsonp', jsonp: 'callback', success: function(data) {...
本文将介绍如何使用jQuery的ajax功能调用WCF服务,并提供一个完整实例供读者参考。 首先,ajax调用WCF服务有跨域和不跨域两种方式。不跨域的ajax调用更为常见,因为它不需要额外配置跨域资源共享(CORS)。在不跨域...
【jQuery调用访问WCF案例】是一个非常适合初学者学习的示例项目,它演示了如何使用JavaScript库jQuery与Windows Communication Foundation (WCF)服务进行交互。WCF是.NET框架中的一个核心组件,用于构建可互操作的...
**Ajax调用WCF服务详解** 在Web开发中,Asynchronous JavaScript and XML(Ajax)技术被广泛用于实现页面的无刷新更新,提高了用户体验。而Windows Communication Foundation(WCF)是微软提供的一种强大的服务导向...
4. **创建jQuery客户端代码**:在HTML页面中使用jQuery的AJAX方法,构建请求参数,调用WCF服务。 5. **处理服务响应**:在AJAX的success回调中处理服务返回的数据,更新页面内容。 6. **调试和测试**:确保服务端和...
以上就是使用jQuery AJAX向后台传递数组参数的完整过程,包括JSON序列化和反序列化的处理。请注意,这只是一个基础示例,实际项目中可能需要考虑更多的错误处理和数据验证。同时,不同的后端框架可能有内置的JSON...
标题“jquery wcf cross ,wcf 跨域”表明这个压缩包包含了关于如何使用jQuery调用WCF服务并解决跨域问题的资料。这里我们将深入探讨这个主题。 首先,理解jQuery的AJAX函数在跨域调用中的作用至关重要。jQuery的$....
总结来说,"Jquery+JSON+REST WCF DEMO"展示了如何利用jQuery与WCF服务进行RESTful通信,利用JSON作为数据交换格式,实现客户端和服务器之间的高效交互。这个DEMO对于学习和理解这些技术的结合使用具有很高的参考...
在本实例中,“ajax跨域调用wcf”是指通过Ajax技术实现对WCF服务的跨域请求。 **什么是Ajax跨域?** 在同源策略限制下,JavaScript通常不能访问不同源(协议、域名或端口不同)的资源。然而,为了实现Web应用的灵活...