一、代码结构:
二、数据实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
using system; using system.collections.generic; using system.linq; using system.runtime.serialization; using system.text; using system.threading.tasks; namespace datastruct { /// < summary > /// 测试数据实体类 /// </ summary > [datacontract] public class testdata { [datamember] public double x { get; set; } [datamember] public double y { get; set; } } } |
三、服务端服务接口和实现:
接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.text; using system.threading.tasks; using datastruct; namespace wcfserver { /// < summary > /// 服务接口 /// </ summary > [servicecontract] public interface iclientserver { /// < summary > /// 计算(测试方法) /// </ summary > [operationcontract] double calculate(testdata data); } } |
实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.text; using system.threading.tasks; using datastruct; namespace wcfserver { /// < summary > /// 服务实现 /// </ summary > [servicebehavior()] public class clientserver : iclientserver { /// < summary > /// 计算(测试方法) /// </ summary > public double calculate(testdata data) { return math.pow(data.x, data.y); } } } |
四、服务端启动服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.servicemodel; using system.servicemodel.description; using system.text; using system.threading.tasks; using system.windows.forms; using utils; using wcfserver; namespace 服务端 { public partial class form1 : form { public form1() { initializecomponent(); } private void form1_load(object sender, eventargs e) { backwork.run(() => { openclientserver(); }, null, (ex) => { messagebox.show(ex.message); }); } /// < summary > /// 启动服务 /// </ summary > private void openclientserver() { netnamedpipebinding wshttp = new netnamedpipebinding(); wshttp.maxbufferpoolsize = 524288; wshttp.maxreceivedmessagesize = 2147483647; wshttp.readerquotas.maxarraylength = 6553600; wshttp.readerquotas.maxstringcontentlength = 2147483647; wshttp.readerquotas.maxbytesperread = 6553600; wshttp.readerquotas.maxdepth = 6553600; wshttp.readerquotas.maxnametablecharcount = 6553600; wshttp.closetimeout = new timespan(0, 1, 0); wshttp.opentimeout = new timespan(0, 1, 0); wshttp.receivetimeout = new timespan(0, 10, 0); wshttp.sendtimeout = new timespan(0, 10, 0); wshttp.security.mode = netnamedpipesecuritymode.none; uri baseaddress = new uri("net.pipe://localhost/pipename1"); servicehost host = new servicehost(typeof(clientserver), baseaddress); servicemetadatabehavior smb = new servicemetadatabehavior(); host.description.behaviors.add(smb); servicebehaviorattribute sba = host.description.behaviors.find< servicebehaviorattribute >(); sba.maxitemsinobjectgraph = 2147483647; host.addserviceendpoint(typeof(iclientserver), wshttp, ""); host.open(); } } } |
五、客户端数据实体类和服务接口类与服务端相同
六、客户端服务实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
using datastruct; using system; using system.collections.generic; using system.linq; using system.servicemodel; using system.servicemodel.description; using system.text; using system.threading.tasks; using wcfserver; namespace dataservice { /// < summary > /// 服务实现 /// </ summary > public class clientserver : iclientserver { channelfactory< iclientserver > channelfactory; iclientserver proxy; public clientserver() { createchannel(); } /// < summary > /// 创建连接客户终端wcf服务的通道 /// </ summary > public void createchannel() { string url = "net.pipe://localhost/pipename1"; netnamedpipebinding wshttp = new netnamedpipebinding(); wshttp.maxbufferpoolsize = 524288; wshttp.maxreceivedmessagesize = 2147483647; wshttp.readerquotas.maxarraylength = 6553600; wshttp.readerquotas.maxstringcontentlength = 2147483647; wshttp.readerquotas.maxbytesperread = 6553600; wshttp.readerquotas.maxdepth = 6553600; wshttp.readerquotas.maxnametablecharcount = 6553600; wshttp.sendtimeout = new timespan(0, 10, 0); wshttp.security.mode = netnamedpipesecuritymode.none; channelfactory = new channelfactory< iclientserver >(wshttp, url); foreach (operationdescription op in channelfactory.endpoint.contract.operations) { datacontractserializeroperationbehavior datacontractbehavior = op.behaviors.find< datacontractserializeroperationbehavior >() as datacontractserializeroperationbehavior; if (datacontractbehavior != null) { datacontractbehavior.maxitemsinobjectgraph = 2147483647; } } } /// < summary > /// 计算(测试方法) /// </ summary > public double calculate(testdata data) { proxy = channelfactory.createchannel(); try { return proxy.calculate(data); } catch (exception ex) { throw ex; } finally { (proxy as icommunicationobject).close(); } } } } |
七、客户端调用服务接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
using dataservice; using datastruct; using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.threading.tasks; using system.windows.forms; using utils; using wcfserver; namespace 客户端 { public partial class form1 : form { public form1() { initializecomponent(); } //测试1 private void button1_click(object sender, eventargs e) { button1.enabled = false; txtsum.text = string.empty; iclientserver client = new clientserver(); double num1; double num2; double sum = 0; if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2)) { datetime dt = datetime.now; backwork.run(() => { sum = client.calculate(new testdata(num1, num2)); }, () => { double time = datetime.now.subtract(dt).totalseconds; txttime.text = time.tostring(); txtsum.text = sum.tostring(); button1.enabled = true; }, (ex) => { button1.enabled = true; messagebox.show(ex.message); }); } else { button1.enabled = true; messagebox.show("请输入合法的数据"); } } //测试2 private void button2_click(object sender, eventargs e) { button2.enabled = false; txtsum.text = string.empty; iclientserver client = new clientserver(); double num1; double num2; double sum = 0; if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2)) { datetime dt = datetime.now; backwork.run(() => { for (int i = 0; i < 1000 ; i++) { sum = client .calculate(new testdata(num1, num2)); } }, () => { double time = datetime.now.subtract(dt).totalseconds; txttime.text = time.tostring(); txtsum.text = sum.tostring(); button2.enabled = true; }, (ex) => { button2.enabled = true; messagebox.show(ex.message); }); } else { button2.enabled = true; messagebox.show("请输入合法的数据"); } } } } |
八、工具类backwork类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
using system; using system.collections.generic; using system.componentmodel; using system.linq; using system.text; /** * 使用方法: backwork.run(() => //dowork { }, () => //runworkercompleted { }, (ex) => //错误处理 { }); */ namespace utils { /// < summary > /// backgroundworker封装 /// 用于简化代码 /// </ summary > public class backwork { /// < summary > /// 执行 /// </ summary > /// < param name = "dowork" >dowork</ param > /// < param name = "workcompleted" >runworkercompleted</ param > /// < param name = "erroraction" >错误处理</ param > public static void run(action dowork, action workcompleted, action< exception > erroraction) { bool isdoworkerror = false; exception doworkexception = null; backgroundworker worker = new backgroundworker(); worker.dowork += (s, e) => { try { dowork(); } catch (exception ex) { isdoworkerror = true; doworkexception = ex; } }; worker.runworkercompleted += (s, e) => { if (!isdoworkerror) { try { if (workcompleted != null) workcompleted(); } catch (exception ex) { erroraction(ex); } } else { erroraction(doworkexception); } }; worker.runworkerasync(); } } } |
九、效果图示:
以上这篇wcf实现进程间管道通信demo分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/s0611163/archive/2017/12/15/8043157.html