很少写东西,但是看到别人写的文章自己又禁不住写点,写了有时候又觉得不好意思给大家看!
今天好不容易鼓起勇气写点……
这几天看了一些WCF的资料
第一感觉是:这玩艺太深了
第二感觉是:这玩艺,挺麻烦的(光配置就搞不明白)
今天调了半天,好不容易把这个返回Json对象,在客户端展示的实例给整理出来了。下面分享给大家
此实例:以IIS为Host承载
1、先建一个WCF Service
建一个ServiceContract接口 1 [ServiceContract]
2
public
interface
IJsonWCFService
3 {
4 ///
5 /// GetJsonResult
6 ///
7 ///
8 ///
9 ///
10 ///
11 /// 为实现Json序列化,添加属性
12 /// [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessage
BodyStyle.Wrapped)]
13 ///
14 ///
15 [OperationContract]
16 [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBody
Style.Wrapped)]
17 JsonResult GetJsonResult( string name, string address, string phone);
18 }
3 {
4 ///
5 /// GetJsonResult
6 ///
7 ///
8 ///
9 ///
10 ///
11 /// 为实现Json序列化,添加属性
12 /// [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessage
BodyStyle.Wrapped)]
13 ///
14 ///
15 [OperationContract]
16 [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBody
Style.Wrapped)]
17 JsonResult GetJsonResult( string name, string address, string phone);
18 }
实现这个接口
1
public
class
JsonWCFService : IJsonWCFService
2 {
3 #region IJsonWCFService Members
4 ///
5 /// Implement the interface
6 ///
7 /// Name
8 /// Address
9 /// PhoneNumber
10 /// JsonResult
11 public JsonResult GetJsonResult( string name, string address, string phone)
12 {
13 JsonResult result = new JsonResult(name, address, phone);
14 return result;
15 }
16 #endregion
17 }
2 {
3 #region IJsonWCFService Members
4 ///
5 /// Implement the interface
6 ///
7 /// Name
8 /// Address
9 /// PhoneNumber
10 /// JsonResult
11 public JsonResult GetJsonResult( string name, string address, string phone)
12 {
13 JsonResult result = new JsonResult(name, address, phone);
14 return result;
15 }
16 #endregion
17 }
这个地方好像忘记了一个返回的DataContract类
1
[DataContract]
2 public class JsonResult
3 {
4 ///
5 /// Construct
6 ///
7 public JsonResult( string name, string address, string phone)
8 {
9 _name = string .Format( " Name:{0} " , name);
10 _address = string .Format( " Address:{0} " , address);
11 _phoneNumber = string .Format( " PhoneNubmer:{0} " , phone);
12 }
13
14 private string _name;
15 ///
16 /// Name
17 ///
18 [DataMember]
19 public string Name
20 {
21 get { return _name; }
22 set { _name = value; }
23 }
24 private string _address;
25 ///
26 /// Address
27 ///
28 [DataMember]
29 public string Address
30 {
31 get { return _address; }
32 set { _address = value; }
33 }
34 private string _phoneNumber;
35 ///
36 /// PhoneNumber
37 ///
38 [DataMember]
39 public string PhoneNumber
40 {
41 get { return _phoneNumber; }
42 set { _phoneNumber = value; }
43 }
2 public class JsonResult
3 {
4 ///
5 /// Construct
6 ///
7 public JsonResult( string name, string address, string phone)
8 {
9 _name = string .Format( " Name:{0} " , name);
10 _address = string .Format( " Address:{0} " , address);
11 _phoneNumber = string .Format( " PhoneNubmer:{0} " , phone);
12 }
13
14 private string _name;
15 ///
16 /// Name
17 ///
18 [DataMember]
19 public string Name
20 {
21 get { return _name; }
22 set { _name = value; }
23 }
24 private string _address;
25 ///
26 /// Address
27 ///
28 [DataMember]
29 public string Address
30 {
31 get { return _address; }
32 set { _address = value; }
33 }
34 private string _phoneNumber;
35 ///
36 /// PhoneNumber
37 ///
38 [DataMember]
39 public string PhoneNumber
40 {
41 get { return _phoneNumber; }
42 set { _phoneNumber = value; }
43 }
2、为实现Json序列化设置,我们还得添加一个WebContentTypeMapper
(此类最终会用在Service的配置文件中)
1
using
System.ServiceModel.Channels;
2
3 namespace Microsoft.Ajax.Samples
4 {
5 ///
6 /// JsonContentTypeMapper
7 /// 用在配置中
8 ///
9 public class JsonContentTypeMapper : WebContentTypeMapper
10 {
11 public override WebContentFormat GetMessageFormatForContentType( string contentType)
12 {
13 if (contentType == " text/javascript " )
14 {
15 return WebContentFormat.Json;
16 }
17 else
18 {
19 return WebContentFormat.Default;
20 }
21 }
22 }
23 }
2
3 namespace Microsoft.Ajax.Samples
4 {
5 ///
6 /// JsonContentTypeMapper
7 /// 用在配置中
8 ///
9 public class JsonContentTypeMapper : WebContentTypeMapper
10 {
11 public override WebContentFormat GetMessageFormatForContentType( string contentType)
12 {
13 if (contentType == " text/javascript " )
14 {
15 return WebContentFormat.Json;
16 }
17 else
18 {
19 return WebContentFormat.Default;
20 }
21 }
22 }
23 }
3、添加svc文件,便于发布Service
svc文件其实是十分简单的一个文件,以下是SVC文件中的内容,可以将此文件添加在网站项目的根目录,也可以是一个子目录。对此没有太多的要求。
1
<%
@ ServiceHost Language
=
"
C#
"
Debug
=
"
true
"
Service
=
"
JsonWCFService
"
%>
4、添加web.config文件
WCFService中相当一部分知识是关于配置的,关于这些内容,一直在“研究”。还没有理出来一个比较顺的思路!
1
xml version="1.0"?>
2 <configuration>
3 <appSettings/>
4 <connectionStrings/>
5 <system.web>
6
7 system.web>
 8   <system.serviceModel>
 9     <behaviors>
10       <endpointBehaviors >
11         <behavior name="jsonWcfBehavior">
12Â Â Â Â Â Â Â Â Â Â Â <webHttp/>
13Â Â Â Â Â Â Â Â Â behavior>
14Â Â Â Â Â Â Â endpointBehaviors>
15Â Â Â Â Â behaviors>
16Â Â Â Â Â <bindings>Â Â Â Â Â Â
17Â Â Â Â Â Â Â <customBinding>Â Â Â Â Â Â Â Â
18         <binding name="JsonMapper">
19Â Â Â Â Â Â Â Â Â Â Â
20           <webMessageEncoding webContentTypeMapperType="Microsoft.Ajax.Samples.JsonC
ontentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=
null">
21Â Â Â Â Â Â Â Â Â Â Â webMessageEncoding>
22           <httpTransport manualAddressing="true"/>
23Â Â Â Â Â Â Â Â Â binding>
24Â Â Â Â Â Â Â customBinding>
25Â Â Â Â Â bindings>
26Â Â Â Â Â <services>Â Â Â Â Â Â
27       <service name="JsonWCFService" >
28Â Â Â Â Â Â Â Â Â
29         <endpoint address="ajaxEndpoint" behaviorConfiguration="jsonWcfBehavior"
30Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â binding="customBinding"
31Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bindingConfiguration="JsonMapper"Â contract="IJsonWCFService">
32Â Â Â Â Â Â Â Â Â endpoint>
33Â Â Â Â Â Â Â service>
34Â Â Â Â Â services>
35Â Â Â system.serviceModel>
36Â configuration>
2 <configuration>
3 <appSettings/>
4 <connectionStrings/>
5 <system.web>
6
7 system.web>
 8   <system.serviceModel>
 9     <behaviors>
10       <endpointBehaviors >
11         <behavior name="jsonWcfBehavior">
12Â Â Â Â Â Â Â Â Â Â Â <webHttp/>
13Â Â Â Â Â Â Â Â Â behavior>
14Â Â Â Â Â Â Â endpointBehaviors>
15Â Â Â Â Â behaviors>
16Â Â Â Â Â <bindings>Â Â Â Â Â Â
17Â Â Â Â Â Â Â <customBinding>Â Â Â Â Â Â Â Â
18         <binding name="JsonMapper">
19Â Â Â Â Â Â Â Â Â Â Â
20           <webMessageEncoding webContentTypeMapperType="Microsoft.Ajax.Samples.JsonC
ontentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=
null">
21Â Â Â Â Â Â Â Â Â Â Â webMessageEncoding>
22           <httpTransport manualAddressing="true"/>
23Â Â Â Â Â Â Â Â Â binding>
24Â Â Â Â Â Â Â customBinding>
25Â Â Â Â Â bindings>
26Â Â Â Â Â <services>Â Â Â Â Â Â
27       <service name="JsonWCFService" >
28Â Â Â Â Â Â Â Â Â
29         <endpoint address="ajaxEndpoint" behaviorConfiguration="jsonWcfBehavior"
30Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â binding="customBinding"
31Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bindingConfiguration="JsonMapper"Â contract="IJsonWCFService">
32Â Â Â Â Â Â Â Â Â endpoint>
33Â Â Â Â Â Â Â service>
34Â Â Â Â Â services>
35Â Â Â system.serviceModel>
36Â configuration>
到此为止,Service算是提供完了,可以运行一下看一下结果。
5、剩下的就是客户端的问题,我们来实现客户端调用WCFService的方法
客户端的内容不算太复杂,其中一好多部分内容我自己觉得:应该是固定写法
1
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
2 < head >
3 < title > Json Service Rresult title>
 4Â
 5     <script language="javascript" type="text/javascript">
 6         function Call(contentType) {
 7             var name = document.getElementById("name").value;
 8             var address = document.getElementById("address").value;
 9             var phone = document.getElementById("phone").value;
10             if (name && address && phone) {
11                 // Create HTTP request
12                 var xmlHttp = CreateHttpRequest();
13                 if (xmlHttp == null) {
14                     alert("æ¤å®ä¾åªè½å¨æ¯æAjaxçæµè§å¨ä¸è¿è¡");
15Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
16Â
17                 // Create result handler
18                 xmlHttp.onreadystatechange = function(){
19                     if (xmlHttp.readyState == 4) {
20                         var result = eval("(" + xmlHttp.responseText + " )").GetJsonResultResult;
21                         var html = result.Name + "
";
22                         html += result.Address + "
";
23                         html += result.PhoneNumber + "
";
24Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â document.getElementById("divMessagePanel").innerHTMLÂ =Â html;
25Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
26Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
27                 //åå§åæä½Url
28                 //tools.self.com:ç«ç¹åå¸çåå
29                 //ajaxEndpoint请åé web.configä¸é ç½®
30Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //ajaxEndpoint"Â behaviorConfiguration="jsonWcfBehavior"
31Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Â Â binding="customBinding"
32Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Â Â bindingConfiguration="JsonMapper"Â contract="IJsonWCFService">
33Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //
34                 //GetJsonResult:æå¡æ¹æ³å称
35                 var url = "http://tools.self.com/Json/JsonWCFService.svc/ajaxEndpoint/GetJsonResult";
36Â
37                 //åå§åJsonæ¶æ¯
38                 var body = '{"name":"';
39                 body = body + name + '","address":"';
40                 body = body + address + '","phone":"';
41                 body = body + phone + '"}';
42                 //åéHttp请æ±
43                 xmlHttp.open("POST", url, true);
44                 xmlHttp.setRequestHeader("Content-type", contentType);
45Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â xmlHttp.send(body);
46Â Â Â Â Â Â Â Â Â Â Â Â Â }
47Â Â Â Â Â Â Â Â Â }
48         //å建HttpRequest对象
49         function CreateHttpRequest() {
50             var httpRequest;
51             try {
52                 httpRequest = new XMLHttpRequest();
53Â Â Â Â Â Â Â Â Â Â Â Â Â }
54             catch (e) {
55                 try {
56                     httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
57Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
58                 catch (e) {
59                     try {
60                         httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
61Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
62                     catch (e) {
63                         return null;
64Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
65Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
66Â Â Â Â Â Â Â Â Â Â Â Â Â }
67             return httpRequest;
68Â Â Â Â Â Â Â Â Â }Â Â Â Â Â Â Â Â
69Â Â Â Â Â Â Â Â Â
70Â Â Â Â Â script>
71Â head>
72Â <body>
73Â Â Â Â Â <h1>
74         JsonContentTypeMapper 客æ·ç«¯é¡µé¢ h1>
75Â Â Â Â Â <p>
76         å§å:
77         <input type="text" id="name" /> p>
78Â Â Â Â Â <p>
79Â Â Â Â Â Â Â Â Â å°å:
80         <input type="text" id="address" /> p>
81Â Â Â Â Â <p>
82         çµè¯å·ç :
83         <input type="text" id="phone" /> p>
84     <input type="button" onclick="return Call('text/javascript');" value="application/json" /><br />
85     <br />
86     <div style="font-size: 16px; color: red" id="divMessagePanel">
87Â Â Â Â Â div>
88Â body>
89Â html>
90
91
2 < head >
3 < title > Json Service Rresult title>
 4Â
 5     <script language="javascript" type="text/javascript">
 6         function Call(contentType) {
 7             var name = document.getElementById("name").value;
 8             var address = document.getElementById("address").value;
 9             var phone = document.getElementById("phone").value;
10             if (name && address && phone) {
11                 // Create HTTP request
12                 var xmlHttp = CreateHttpRequest();
13                 if (xmlHttp == null) {
14                     alert("æ¤å®ä¾åªè½å¨æ¯æAjaxçæµè§å¨ä¸è¿è¡");
15Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
16Â
17                 // Create result handler
18                 xmlHttp.onreadystatechange = function(){
19                     if (xmlHttp.readyState == 4) {
20                         var result = eval("(" + xmlHttp.responseText + " )").GetJsonResultResult;
21                         var html = result.Name + "
";
22                         html += result.Address + "
";
23                         html += result.PhoneNumber + "
";
24Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â document.getElementById("divMessagePanel").innerHTMLÂ =Â html;
25Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
26Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
27                 //åå§åæä½Url
28                 //tools.self.com:ç«ç¹åå¸çåå
29                 //ajaxEndpoint请åé web.configä¸é ç½®
30Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //ajaxEndpoint"Â behaviorConfiguration="jsonWcfBehavior"
31Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Â Â binding="customBinding"
32Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Â Â bindingConfiguration="JsonMapper"Â contract="IJsonWCFService">
33Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â //
34                 //GetJsonResult:æå¡æ¹æ³å称
35                 var url = "http://tools.self.com/Json/JsonWCFService.svc/ajaxEndpoint/GetJsonResult";
36Â
37                 //åå§åJsonæ¶æ¯
38                 var body = '{"name":"';
39                 body = body + name + '","address":"';
40                 body = body + address + '","phone":"';
41                 body = body + phone + '"}';
42                 //åéHttp请æ±
43                 xmlHttp.open("POST", url, true);
44                 xmlHttp.setRequestHeader("Content-type", contentType);
45Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â xmlHttp.send(body);
46Â Â Â Â Â Â Â Â Â Â Â Â Â }
47Â Â Â Â Â Â Â Â Â }
48         //å建HttpRequest对象
49         function CreateHttpRequest() {
50             var httpRequest;
51             try {
52                 httpRequest = new XMLHttpRequest();
53Â Â Â Â Â Â Â Â Â Â Â Â Â }
54             catch (e) {
55                 try {
56                     httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
57Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
58                 catch (e) {
59                     try {
60                         httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
61Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
62                     catch (e) {
63                         return null;
64Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
65Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
66Â Â Â Â Â Â Â Â Â Â Â Â Â }
67             return httpRequest;
68Â Â Â Â Â Â Â Â Â }Â Â Â Â Â Â Â Â
69Â Â Â Â Â Â Â Â Â
70Â Â Â Â Â script>
71Â head>
72Â <body>
73Â Â Â Â Â <h1>
74         JsonContentTypeMapper 客æ·ç«¯é¡µé¢ h1>
75Â Â Â Â Â <p>
76         å§å:
77         <input type="text" id="name" /> p>
78Â Â Â Â Â <p>
79Â Â Â Â Â Â Â Â Â å°å:
80         <input type="text" id="address" /> p>
81Â Â Â Â Â <p>
82         çµè¯å·ç :
83         <input type="text" id="phone" /> p>
84     <input type="button" onclick="return Call('text/javascript');" value="application/json" /><br />
85     <br />
86     <div style="font-size: 16px; color: red" id="divMessagePanel">
87Â Â Â Â Â div>
88Â body>
89Â html>
90
91
到此整个功能算是完成了。
Service,Host,Client都有了,功德圆满,大家可以运行看一下结果。