UWP使用AppService向另一个UWP客户端应用程序提供服务
原文:UWP使用AppService向另一个UWP客户端应用程序提供服务
在上篇里,我使用的是寄宿在WPF上的WCF进行两个程序间的通信,在解决问题的同时,我的同事也在思考能否使用UWP来做这件事。于是,我们发现了App Service,两个UWP应用沟通的桥梁。
App Service以background task 的形式允许一个UWP向其它UWP提供服务。
首先我们新建一个名为"MyCalculatorService"的Windows Runtime Component项目,新建Calculator类,实现 IBackgroundTask.接口,它很类似WCF里的ServiceContract。
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,没错,我就是懒
UWP使用AppService向另一个UWP客户端应用程序提供服务的更多相关文章
- (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
- (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
- 我的第一个UWP程序
1.为什么喜欢UWP 本人无悔入网易云音乐,各种设备上都少不了这个红色图标的软件 从win10发布,网易做了UWP版本的云音乐 应用轻巧.简洁.功能全,接着又下了许多UWP的应用 都给人不一样的感觉, ...
- win10 uwp 使用 msbuild 命令行编译 UWP 程序
原文:win10 uwp 使用 msbuild 命令行编译 UWP 程序 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http:// ...
- 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...
- 我的第一个REST客户端程序!
Delphi:XE8 看了好几天的资料了,也没有弄出来一个REST程序,尝试了XE8中带的例子,也都没有搞懂.我在网上不断搜索,看是否能够找到适合自己的文章,希望能够做出来一个REST的小例子,万幸, ...
- zabbix学习-如何部署一个agent客户端
1. 部署一个agent客户端很简单,比如监控服务器本身 yum install zabbix-agent -y 2.配置文件位置: vim /etc/zabbix/zabbix-agendt.con ...
- 使用c++实现一个FTP客户端(一)
之前使用c++实现了一个FTP客户端,在这里做一些记录. 一.需要注意的几点 ①FTP是一种文件传输协议,基于TCP,所以客户端与服务器建立的连接是可靠.安全的,并且要经过三次握手的过程. ②FTP传 ...
- 学习T-io框架,从写一个Redis客户端开始
前言 了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...
随机推荐
- poi读取excell表格
原文链接:http://blog.csdn.net/qq_37936542/article/details/79024847 最近项目需要实现一个将excell中的数据导入数据库,在网上找到这篇文章, ...
- Java环境搭建若干问题
0.总体说明 本次搭建环境,为了偷懒,使用的是,阿里云镜像. 自带了Nginx.Tomcat.JDK等. 比较坑爹的是,虽然镜像带了很多安装好的软件,但是也有各种问题,比如它修改了tomc ...
- Everything starts with a dream(A day has only 24 hours and these things take time,所以要抓紧)
There is the famous quote: "Everything starts with a dream" and many years ago, Michael Va ...
- Unity UGUI——Rect Transform包(Anchors)
Anchors(锚)操作演示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fontsize/400/ ...
- 高性能分布式应用开发中间件ICE介绍
作为一个技术人员,你是否在为不断增长的数据量和日益复杂的业务逻辑而头疼不已,杂乱堆砌在一起的庞大业务让系统越来越脆弱,于是你想到了网格,想到了利用分布式来重组一个健壮的系统架构. 随后,RMI,EJB ...
- MFC下WM_NOTIFY消息处理流程
参考文章:MFC的消息反射机制 在前一篇文章:MFC消息处理流程概述中描述了MFC消息处理的大体流程.由CWnd::OnWndMsg函数可知,当消息为WM_NOTIFY消息时,调用的是virtual ...
- 图像块的访问(填充 padding,步长 stride,窗 Window/kernel/filter)
无填充是有填充的特例(填充为 1). utilities(matlab)-- 图像分块(image2cols.cols2image)(未填充) 1. 一个图像块 ⇒ 返回一个值 输出矩阵的大小: ou ...
- Verilog分频器
verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1.自己动手写了第一个verilog程序. 题目: 利用10M的时钟,设计一个单周期形状例如以下的周期波形. 思考: 最開始的想法是 ...
- wpf控件开发基础(3) -属性系统(2)
原文:wpf控件开发基础(3) -属性系统(2) 上篇说明了属性存在的一系列问题. 属性默认值,可以保证属性的有效性. 属性验证有效性,可以对输入的属性进行校验 属性强制回调, 即不管属性有无发生变化 ...
- cocos2dx-3.1加入cocosStudio参考库 libCocosStudio
一个,创建好项目 两,在"解(项目名称)".选择现有项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2dzbHVja3k=/fon ...