zoukankan      html  css  js  c++  java
  • 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,没错,我就是懒

  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14199377.html
Copyright © 2011-2022 走看看