zoukankan      html  css  js  c++  java
  • UWP App Services in Windows 10

    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 = 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();
                }
            }
        }
    View Code

    现在 下一步 来创建一个项目来暴露这个功能在客户端应用(类似WCF环境的宿主)

    创建UWP项目 命名MyCalculatorServiceProvider。导入 MyCalculatorService 项目从引用里。

    现在打开MyCalculatorServiceProvider 项目的Package.appxmanifest文件。右键打开,找到申明应用服务实例命名CalculatorService1 ,

    在entry point 中键入MyCalculatorService.Calculator (看上面的代码,这是实现IBackgroundTask的类)

    最后一步来运行创建的这个服务客户端,这个服务提供的应用必须要部署 在你调用服务之前。你也需要这个服务应用(MyCalculatorServiceProvider )的包名,为了调用他。

    在创建一个UWP项目命名 CalculatorClient。你会注意到这个名字是以服务名定义的, 为了得到PackageFamilyName  我们有两种方法。

    第一个方法:通过调用 Windows.ApplicationModel.Package.Current.Id.FamilyName Jump  包含在 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;
        }
        }
    View Code

    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文章

  • 相关阅读:
    mysql 权限问题
    触发器作用
    带有循环功能的存储过程
    带有条件判断的存储过程
    数据存储 三大范式-----------待续
    存储过程自 带条件判断的存储过程
    线程异步更新UI
    TextBox只能输入数字
    C#中无边框窗体移动或拖控件移动窗体
    classloader原理
  • 原文地址:https://www.cnblogs.com/androllen/p/7692305.html
Copyright © 2011-2022 走看看