在上篇里,我使用的是寄宿在WPF上的WCF进行两个程序间的通信,在解决问题的同时,我的同事也在思考能否使用UWP来做这件事。于是,我们发现了App Service,两个UWP应用沟通的桥梁。
App Service以background task 的形式允许一个UWP向其它UWP提供服务。
首先我们新建一个名为"MyCalculatorService"的Windows Runtime Component项目,新建Calculator类,实现 IBackgroundTask.接口,它很类似WCF里的ServiceContract。
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
|
public sealed class Calculator : IBackgroundTask { private BackgroundTaskDeferral backgroundTaskDeferral; private AppServiceConnection appServiceConnection; public void Run(IBackgroundTaskInstance taskInstance) { this .backgroundTaskDeferral = taskInstance.GetDeferral(); var details = taskInstance.TriggerDetails as AppServiceTriggerDetails; appServiceConnection = details.AppServiceConnection; appServiceConnection.RequestReceived += OnRequestReceived; taskInstance.Canceled += OnTaskCanceled; } private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) { var messageDeferral = args.GetDeferral(); ValueSet message = args.Request.Message; ValueSet returnData = new ValueSet(); string command = message[ "Command" ] as string ; //Add, Subtract, Multiply, Divide int ? firstNumber = message[ "Input1" ] as int ?; int ? secondNumber = message[ "Input2" ] as int ?; int ? result = 0; if (firstNumber.HasValue && secondNumber.HasValue) { switch (command) { case "Add" : { result = firstNumber + secondNumber; returnData.Add( "Result" , result.ToString()); returnData.Add( "Status" , "Complete" ); break ; } case "Subtract" : { result = firstNumber - secondNumber; returnData.Add( "Result" , result.ToString()); returnData.Add( "Status" , "Complete" ); break ; } case "Multiply" : { result = firstNumber * secondNumber; returnData.Add( "Result" , result.ToString()); returnData.Add( "Status" , "Complete" ); break ; } case "Divide" : { result = firstNumber / secondNumber; returnData.Add( "Result" , result.ToString()); returnData.Add( "Status" , "Complete" ); break ; } default : { returnData.Add( "Status" , "Fail: unknown command" ); break ; } } } await args.Request.SendResponseAsync(returnData); messageDeferral.Complete(); } private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { if ( this .backgroundTaskDeferral != null ) { this .backgroundTaskDeferral.Complete(); } } } |
然后再新建一个名为MyCalculatorServiceProvider的UWP程序,充当服务端角色,相当于WCF宿主服务的。引用刚才我们创建的wind,然后在 Package.appxmanifest 中声明一个 名为CalculatorService1的App Service 实例,添加 入口点"MyCalculatorService.Calculator"。
现在我们来创建名为“CalculatorClient”的客户端,并调用以上服务。添加以下代码
public sealed partial class MainPage : Page { private AppServiceConnection calculatorService; public MainPage() { this.InitializeComponent(); } private async void button_Click(object sender, RoutedEventArgs e) { //Add the connection if (calculatorService == null) { calculatorService = new AppServiceConnection(); calculatorService.AppServiceName = "CalculatorService1"; calculatorService.PackageFamilyName = "83da5395-2473-49fb-b361-37072e87e9b9_xe3s0d4n4696a"; var status = await calculatorService.OpenAsync(); if (status != AppServiceConnectionStatus.Success) { Result.Content = "Failed to connect"; return; } } //Call the service int num1 = int.Parse(InputtextBox1.Text); int num2 = int.Parse(InputtextBox2.Text); var message = new ValueSet(); message.Add("Command", Operation.SelectionBoxItem); message.Add("Input1", num1); message.Add("Input2", num2); AppServiceResponse response = await calculatorService.SendMessageAsync(message); string result = ""; if (response.Status == AppServiceResponseStatus.Success) { //Get the data that the service sent if (response.Message["Status"] as string == "Complete") { result = response.Message["Result"] as string; } } message.Clear(); ResulttextBlock.Text = result; } }
注意其中的AppServiceName是我们在MyCalculatorServiceProvider项目中定义的App Service的Name,PackageFamilyName 是MyCalculatorServiceProvider项目的PackageFamilyName。
完成后,先部署MyCalculatorServiceProvider再部署CalculatorClient,效果是不是跟WCF很类似呢?
示例demo可以从这里下http://www.cnblogs.com/luquanmingren/p/7692305.html,没错,我就是懒