UWP App Services in Windows 10
1.AppServices in Universal Windows Platform(UWP)
UWP 应用服务可以提供给另一个UWP应用。在Win10系统中,一个应用服务当作应用的一个方法和机制来提供服务给其他应用。
一个后台任务的应用服务工作的形式(你可以在后台跑代码,通过后台接口实现)。前台客户端可以引用另一个应用的服务在后台中执行任务。
应用服务就像web 服务一样在Win10设备中使用。
首先,让我们来创建一个 Windows Runtime Component (Universal Windows) 项目 命名"MyCalculatorService"。 这会是我们的计算服务应用。
创建一个以Calculator 为类名的 实现 IBackgroundTask接口。在WCF技术中,你可以说这个类是我们的带操作契约的服务契约
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(); } } }
现在 下一步 来创建一个项目来暴露这个功能在客户端应用(类似WCF环境的宿主)
创建UWP项目 命名MyCalculatorServiceProvider。导入 MyCalculatorService 项目从引用里。
现在打开MyCalculatorServiceProvider 项目的Package.appxmanifest文件。右键打开,找到申明应用服务实例命名CalculatorService1 ,
在entry point 中键入MyCalculatorService.Calculator (看上面的代码,这是实现IBackgroundTask的类)
最后一步来运行创建的这个服务客户端,这个服务提供的应用必须要部署 在你调用服务之前。你也需要这个服务应用(MyCalculatorServiceProvider )的包名,为了调用他。
在创建一个UWP项目命名 CalculatorClient。你会注意到这个名字是以服务名定义的, 为了得到PackageFamilyName 我们有两种方法。
第一个方法:通过调用 Windows.ApplicationModel.Package.Current.Id.FamilyName 包含在 MyCalculatorServiceProvider 项目中可以跑一下。
第二个方法:找到部署MyCalculatorServiceProvider 项目的全路径
图片选中的 d1238b67-b1ef-4782-9f3e-df718d97e378_8wekyb3d8bbwe 这个就是 PackageFamilyName
这是核心代码
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; } }
4.先安装应用服务(服务寄宿在UWP应用里,部署即可),在安装客户端。
5.打开客户端开始计算,就好找到本台机器应用服务程序。(只限同一台机器)
引用:
如果要使用UWP在本台计算机访问其他电脑的WCF服务的画,在App.config文件里修改baseAddress地址为192.168.X.X 这样才能找到
请看WCF文章