UWP使用AppService向另一个UWP客户端应用程序提供服务

简介: 原文:UWP使用AppService向另一个UWP客户端应用程序提供服务在上篇里,我使用的是寄宿在WPF上的WCF进行两个程序间的通信,在解决问题的同时,我的同事也在思考能否使用UWP来做这件事。于是,我们发现了App Service,两个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很类似呢?

好吧,以上都是我从https://social.technet.microsoft.com/wiki/contents/articles/36719.wcf-app-services-in-universal-windows-platform-uwp-using-windows-10.aspx抄的,,,

示例demo可以从这里下http://www.cnblogs.com/luquanmingren/p/7692305.html,没错,我就是懒

 

目录
相关文章
C#开源的虚拟桌宠模拟器,可以内置到任何WPF应用程序 - VPet
C#开源的虚拟桌宠模拟器,可以内置到任何WPF应用程序 - VPet
164 0
|
Windows
Qt-Windows下发布应用程序
QtWindows下发布应用程序
115 0
|
API Windows 开发工具
使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越实在太久远,兼容性依然是避不开的问题。
1937 0
|
API C# Windows
起调UWP的几种方法
原文:起调UWP的几种方法 由于种种原因吧,我需要使用一个WPF程序起调一个UWP程序,下面总结一下,给自己个备份。 启动UWP程序的关键是协议启动 给我们的UWP应用添加一个协议,like this: 然后使用协议启动该UWP有一下几种方式: 1.
1025 0
|
Windows 数据格式 XML
UWP: 通过命令行启动 UWP 应用
原文:UWP: 通过命令行启动 UWP 应用 最近在开发应用的过程中,我遇到了如标题所述的需求,其实主要是为了能够快捷启动应用,正像我们可以在“运行”对话框中可以输入一些可执行程序的名称后,就能够直接启动它;这样做,可以增加 App 的易用性。
2339 0
|
API Android开发 iOS开发
使您的Xamarin.Forms应用程序可访问
iOS,Android和Windows都会为开发人员公开API,为每个人构建可访问的移动应用。 我们很高兴地宣布,我们在Xamarin.Forms中添加了可用性的新API,以便开发人员更轻松地构建可访问的跨平台移动应用程序。
1002 0
|
存储
【UWP开发】uwp应用安装失败
原文:【UWP开发】uwp应用安装失败 编译出了uwp应用.appx之后双击打开,报错你需要为此应用包而安装的新证书,或者是带有受信任证书的新应用包。系统管理员或应用开发人员可以提供帮助。证书链在不受信任的根证书中进行处理,但也在其中终止 (0x800B0109) 解决办法: 1、右键.
4897 0
|
存储 测试技术
【Xamarin】快速生成和发布五星级应用程序
移动应用程序的第一步是构建自动化,它构建应用程序并运行所需的测试,以确保应用程序遵循所需的规则。 构建自动化也是运送高品质,五星级移动应用程序的第一步。 在构建iOS和Android移动应用程序时,主要的挑战之一就是正确安装所需的工具和SDK,以便成功构建应用程序并运行测试。
1093 0