1.设计服务协定 比较好的方法是接口来定义服务的协定
1
using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.Text;
7
8 namespace WcfService2
9 {
10 [ServiceContract] // 服务协定定义
11
12 public interface IInterface1
13 {
14 [OperationContract] // 要公开的服务方法
15 string Function1( int value);
16
17 }
18 [ServiceContract] // 定义的第二个服务协定
19 public interface IService1
20 {
21
22 [OperationContract]
23 string GetData( int value);
24
25 [OperationContract]
26 CompositeType GetDataUsingDataContract(CompositeType composite);
27
28 // TODO: Add your service operations here
29 }
30
31
32 [DataContract] // 数据协定 定义
33 public class CompositeType
34 {
35 bool boolValue = true;
36 string stringValue = " Hello ";
37
38 [DataMember]
39 public bool BoolValue
40 {
41 get { return boolValue; }
42 set { boolValue = value; }
43 }
44
45 [DataMember]
46 public string StringValue
47 {
48 get { return stringValue; }
49 set { stringValue = value; }
50 }
51 }
52 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.Text;
7
8 namespace WcfService2
9 {
10 [ServiceContract] // 服务协定定义
11
12 public interface IInterface1
13 {
14 [OperationContract] // 要公开的服务方法
15 string Function1( int value);
16
17 }
18 [ServiceContract] // 定义的第二个服务协定
19 public interface IService1
20 {
21
22 [OperationContract]
23 string GetData( int value);
24
25 [OperationContract]
26 CompositeType GetDataUsingDataContract(CompositeType composite);
27
28 // TODO: Add your service operations here
29 }
30
31
32 [DataContract] // 数据协定 定义
33 public class CompositeType
34 {
35 bool boolValue = true;
36 string stringValue = " Hello ";
37
38 [DataMember]
39 public bool BoolValue
40 {
41 get { return boolValue; }
42 set { boolValue = value; }
43 }
44
45 [DataMember]
46 public string StringValue
47 {
48 get { return stringValue; }
49 set { stringValue = value; }
50 }
51 }
52 }
2.实现服务协定 也就是用类实现已定义好的接口
1
using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.Text;
7
8 namespace WcfService2
9 {
10 public class Service1 : IService1,IInterface1
11 {
12 public string GetData( int value)
13 {
14 return string.Format( " You entered: {0} ", value);
15 }
16
17 public CompositeType GetDataUsingDataContract(CompositeType composite)
18 {
19 if (composite.BoolValue)
20 {
21 composite.StringValue += " Suffix ";
22 }
23 return composite;
24 }
25
26 public string Function1( int a)
27 {
28 return " hello world! ";
29 }
30 }
31 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.Text;
7
8 namespace WcfService2
9 {
10 public class Service1 : IService1,IInterface1
11 {
12 public string GetData( int value)
13 {
14 return string.Format( " You entered: {0} ", value);
15 }
16
17 public CompositeType GetDataUsingDataContract(CompositeType composite)
18 {
19 if (composite.BoolValue)
20 {
21 composite.StringValue += " Suffix ";
22 }
23 return composite;
24 }
25
26 public string Function1( int a)
27 {
28 return " hello world! ";
29 }
30 }
31 }
3.承载服务的实现 实现服务的宿主
a.用windowform 实现的宿主
1
using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using WcfService2;
10 using System.ServiceModel;
11 using System.ServiceModel.Description;
12
13 namespace Host001
14 {
15 public partial class Form1 : Form
16 {
17 ServiceHost sHost = null;
18
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click( object sender, EventArgs e)
25 {
26 Uri uri = new Uri( " http://localhost:8000 "); // 服务的地址
27
28 sHost = new ServiceHost( typeof(Service1), uri); // 创建服务宿主
29
30 sHost.AddServiceEndpoint( typeof(IService1), new WSHttpBinding(), " Service1 "); // 添加第一个终结点
31 sHost.AddServiceEndpoint( typeof(IInterface1), new WSHttpBinding(), " Interface1 "); // 第二个终结点
32
33 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); // 定义服务传输层
34 smb.HttpGetEnabled = true; // 定义传输的属性
35 sHost.Description.Behaviors.Add(smb);
36
37
38 sHost.Open(); // 打开服务
39 }
40 }
41 }
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using WcfService2;
10 using System.ServiceModel;
11 using System.ServiceModel.Description;
12
13 namespace Host001
14 {
15 public partial class Form1 : Form
16 {
17 ServiceHost sHost = null;
18
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click( object sender, EventArgs e)
25 {
26 Uri uri = new Uri( " http://localhost:8000 "); // 服务的地址
27
28 sHost = new ServiceHost( typeof(Service1), uri); // 创建服务宿主
29
30 sHost.AddServiceEndpoint( typeof(IService1), new WSHttpBinding(), " Service1 "); // 添加第一个终结点
31 sHost.AddServiceEndpoint( typeof(IInterface1), new WSHttpBinding(), " Interface1 "); // 第二个终结点
32
33 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); // 定义服务传输层
34 smb.HttpGetEnabled = true; // 定义传输的属性
35 sHost.Description.Behaviors.Add(smb);
36
37
38 sHost.Open(); // 打开服务
39 }
40 }
41 }
b.用web服务器做为wcf 的宿主
实现wcf 服务发布 .svc文件
<%
@ServiceHost language
=
"
c#
"
Debug
=
"
true
"
Service
=
"
WcfService2.Service1
"
%>
在web.config 中配置wcf 服务
1
<
system.serviceModel
>
2 < services >
3 < service name ="WcfService2.Service1" behaviorConfiguration ="MyServiceTypeBehaviors" >
4
5 <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
6 < endpoint address ="Service1"
7 binding ="wsHttpBinding"
8 contract ="WcfService2.IService1" />
9 < endpoint address ="Interface1"
10 binding ="wsHttpBinding"
11 contract ="WcfService2.IInterface1" />
12
13 <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->
14 < endpoint address ="mex"
15 binding ="mexHttpBinding"
16 contract ="IMetadataExchange" />
17
18 </ service >
19 </ services >
20 < behaviors >
21 < serviceBehaviors >
22 < behavior name ="MyServiceTypeBehaviors" >
23 < serviceMetadata httpGetEnabled ="true" />
24 </ behavior >
25 </ serviceBehaviors >
26 </ behaviors >
27
28 </ system.serviceModel >
2 < services >
3 < service name ="WcfService2.Service1" behaviorConfiguration ="MyServiceTypeBehaviors" >
4
5 <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
6 < endpoint address ="Service1"
7 binding ="wsHttpBinding"
8 contract ="WcfService2.IService1" />
9 < endpoint address ="Interface1"
10 binding ="wsHttpBinding"
11 contract ="WcfService2.IInterface1" />
12
13 <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->
14 < endpoint address ="mex"
15 binding ="mexHttpBinding"
16 contract ="IMetadataExchange" />
17
18 </ service >
19 </ services >
20 < behaviors >
21 < serviceBehaviors >
22 < behavior name ="MyServiceTypeBehaviors" >
23 < serviceMetadata httpGetEnabled ="true" />
24 </ behavior >
25 </ serviceBehaviors >
26 </ behaviors >
27
28 </ system.serviceModel >
4.添加wcf 服务引用
用.net IDE 或 用 svcutil.exe 工具 生成 wcf 服务的 stub 文件
5. 创建wcf 服务 的客户端
1
using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using Client1.ServiceReference2;
10
11 namespace Client1
12 {
13 public partial class Form1 : Form
14 {
15 Service1Client service1 = new Service1Client(); // 实例化终结点1
16 Interface1Client interface1 = new Interface1Client(); // 实例化第二个终结点
17
18 public Form1()
19 {
20 InitializeComponent();
21 service1.Open();
22 }
23
24 private void button1_Click( object sender, EventArgs e)
25 {
26 label1.Text = service1.GetData( 21); // 调用wcf的方法
27 CompositeType v = new CompositeType() ; // 生成传入数据协定的数据实例
28 v.BoolValue = true;
29 v.StringValue = " hello ";
30 CompositeType type = service1.GetDataUsingDataContract(v); // 调用wcf的方法
31 string s = interface1.Function1( 1); // 调用wcf的方法
32 }
33 }
34 }
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using Client1.ServiceReference2;
10
11 namespace Client1
12 {
13 public partial class Form1 : Form
14 {
15 Service1Client service1 = new Service1Client(); // 实例化终结点1
16 Interface1Client interface1 = new Interface1Client(); // 实例化第二个终结点
17
18 public Form1()
19 {
20 InitializeComponent();
21 service1.Open();
22 }
23
24 private void button1_Click( object sender, EventArgs e)
25 {
26 label1.Text = service1.GetData( 21); // 调用wcf的方法
27 CompositeType v = new CompositeType() ; // 生成传入数据协定的数据实例
28 v.BoolValue = true;
29 v.StringValue = " hello ";
30 CompositeType type = service1.GetDataUsingDataContract(v); // 调用wcf的方法
31 string s = interface1.Function1( 1); // 调用wcf的方法
32 }
33 }
34 }