• uwp 中的appservice


    在上篇里,我使用的是寄宿在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很类似呢?

    好吧,以上都是我从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,没错,我就是懒

  • 相关阅读:
    python requests模块
    python 模拟豆瓣登录(豆瓣6.0)
    python 抓取糗事百科糗图
    python bz2模块
    the python challenge闯关记录(9-16)
    python之PIL库(Image模块)
    python之zipfile
    python之pickle模块
    the python challenge闯关记录(0-8)
    KVO简介
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14199377.html
Copyright © 2020-2023  润新知