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 = ; 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;
}
}

2.应用服务sample

3.客户端sample

4.先安装应用服务(服务寄宿在UWP应用里,部署即可),在安装客户端。

5.打开客户端开始计算,就好找到本台机器应用服务程序。(只限同一台机器)

引用:

https://social.technet.microsoft.com/wiki/contents/articles/36719.wcf-app-services-in-universal-windows-platform-uwp-using-windows-10.aspx

如果要使用UWP在本台计算机访问其他电脑的WCF服务的画,在App.config文件里修改baseAddress地址为192.168.X.X 这样才能找到

请看WCF文章

UWP App Services in Windows 10的更多相关文章

  1. 1)Win10-UWA开发 UWP应用操作方法、Windows 10应用程序的指南

    孙广东   2015.8.22 全部任务类型(比方在列表中显示数据或创建导航窗格)的说明和代码演示样例. 在这一节 包含例如以下: 主题 描写叙述 Accessibility 创建通用的Windows ...

  2. Windows 10 后台音频

    UWP版本的网易云音乐已经上架,虽然还不支持Windows Phone但是整体而言功能已经比较齐全了! 那么如何在Windows 10 UWP实现后台播放呢? 我之前是一直在做Windows Phon ...

  3. 打包一个UWP APP

    Before packaging your app Test your app. Before you package your app for store submission, make sure ...

  4. 基于Windows 10平台的PM2.5检测器制作

    本篇文章详细讲解了如何利用SDS011激光式PM2.5传感器.HC-06蓝牙模块和Windows 10设备完成一个简单的PM2.5检测器及其应用程序的开发.该检测器使用蓝牙完成数据输出,方便设备连接, ...

  5. UWP深入学习六:Build better apps: Windows 10 by 10 development series

    Promotion in the Windows Store  In this article, I walk through how to Give your Store listing a mak ...

  6. New Windows 10 SDK - Multi-instance UWP apps

    概述 前面一篇 About Windows 10 SDK Preview Build 17110 中,我们简单介绍了 Multi-instance UWP Apps,今天结合开发过程详细讲解一下. 在 ...

  7. 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

    [源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...

  8. Windows 10 UWP程序标题栏设置

    在Windows 10程序中,以前只能用于全屏方式的Metro程序现在可以运行在窗口模式下了,并且改了个新名字,叫Windows 通用程序(Universal Windows app),简称UWP程序 ...

  9. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...

随机推荐

  1. scrapy-redis 之处理异常

    今天心情不好 不想多打字 自己看注释吧 from scrapy.http import HtmlResponse from twisted.internet import defer from twi ...

  2. [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)

    传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...

  3. [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)

    传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...

  4. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)

    传送门 Description 给出 n 个点和 n−1 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模. Input 第一行包含一个正整数 N(N& ...

  5. Python 3下使用Matplotlib工具画图,中文显示乱码的问题解决

    import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif']=['SimHei'] ...

  6. CSS学习笔记之选择器

    目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...

  7. Windows 2003 IIS 不支持ASP的问题

    Windows 2003 IIS 不支持ASP的问题 问题: HTTP 错误 404 - 文件或目录未找到. Internet 信息服务 (IIS) 第一步,启用Asp,进入:控制面板 -> 管 ...

  8. oracle到mysql的导数据方式(适用于任意数据源之间的互导)

    http://www.wfuyu.com/Internet/19955.html 为了生产库释放部份资源, 需要将API模块迁移到mysql中,及需要导数据. 尝试了oracle to mysql工具 ...

  9. ubuntu-ln命令

    安装软件完成后,常常需要使用ln命令来将命令重新定义一下路径,就相当于windows中的加入系统环境变量的意思 ~ sudo ln -s /home/spike/Downloads/redis/src ...

  10. 一次完整的http事务

    一次完整的http事务 https://www.processon.com/view/link/56c6679ce4b0f0c4285e69c0 规范把 HTTP 请求分为三个部分:状态行.请求头.消 ...