与远程应用服务通信

除了在远程设备上使用 URI 启动应用,还可以在远程设备上运行应用服务并与之通信。 任何基于 Windows 的设备均可用作客户端或主设备。 这可使你使用几乎无限种方法与已连接的设备交互,而无需在前台显示应用。

在主设备上设置应用服务

为了在远程设备上运行应用服务,必须已经在该设备上安装了该应用服务的提供程序。 本指南将使用 Windows 通用示例存储库提供的随机数字生成器应用服务示例 CSharp 版。 有关如何编写你自己的应用服务的说明,请参阅创建和使用应用服务

无论是使用已制定的应用服务还是编写自己的应用服务,你都将需要执行一些编辑操作,以使该服务与远程系统兼容。 在 Visual Studio 中,转到应用服务提供程序的项目(在示例中称为“AppServicesProvider”),然后选择其 Package.appxmanifest 文件。 右键单击并选择“查看代码”以查看文件的完整内容。 在主 Application 元素内创建 Extensions 元素(或者如果已存在,请找到它)。 然后创建 Extension,将项目定义为应用服务并引用其父项目。

...
<Extensions>
    <uap:Extension Category="windows.appService" EntryPoint="RandomNumberService.RandomNumberGeneratorTask">
        <uap3:AppService Name="com.microsoft.randomnumbergenerator"/>
    </uap:Extension>
</Extensions>
...

在 AppService 元素的旁边添加 SupportsRemoteSystems 属性:

...
<uap3:AppService Name="com.microsoft.randomnumbergenerator" SupportsRemoteSystems="true"/>
...

为了在 uap3 命名空间中使用元素,必须在清单文件顶部添加命名空间定义(如果尚未添加)。

<?xml version="1.0" encoding="utf-8"?>
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3">
  ...
</Package>

然后生成应用服务提供程序项目,并将其部署到主设备。

从客户端设备定向应用服务

从其中调用远程应用服务的设备需要具有远程系统功能的应用。 此功能可添加到在主设备上提供应用服务的相同应用(在此情况下,需要在两台设备上安装相同应用),或者在完全不同的应用中实现。

本节中的代码需要以下 using 语句以按原样运行:

using Windows.ApplicationModel.AppService;
using Windows.System.RemoteSystems;

首先必须实例化 AppServiceConnection 对象,就像本地调用应用服务一样。 创建和使用应用服务对此过程做了更为详细的介绍。 在此示例中,要定向的应用服务是随机数字生成器服务。

注意

假定在调用以下方法的代码中已通过某种方法获取了 RemoteSystem 对象。 有关如何设置的说明,请参阅启动远程应用

// This method returns an open connection to a particular app service on a remote system.
// param "remotesys" is a RemoteSystem object representing the device to connect to.
private async void openRemoteConnectionAsync(RemoteSystem remotesys)
{
    // Set up a new app service connection. The app service name and package family name that
    // are used here correspond to the AppServices UWP sample.
    AppServiceConnection connection = new AppServiceConnection
    {
        AppServiceName = "com.microsoft.randomnumbergenerator",
        PackageFamilyName = "Microsoft.SDKSamples.AppServicesProvider.CS_8wekyb3d8bbwe"
    };

接下来,为计划的远程设备创建 RemoteSystemConnectionRequest 对象。 随后它将用于向该设备打开 AppServiceConnection。 请注意,在以下示例中,极大地简化了错误处理和报告以实现简便性。

// a valid RemoteSystem object is needed before going any further
if (remotesys == null)
{
    return;
}

// Create a remote system connection request for the given remote device
RemoteSystemConnectionRequest connectionRequest = new RemoteSystemConnectionRequest(remotesys);

// "open" the AppServiceConnection using the remote request
AppServiceConnectionStatus status = await connection.OpenRemoteAsync(connectionRequest);

// only continue if the connection opened successfully
if (status != AppServiceConnectionStatus.Success)
{
    return;
}

此时,在远程计算机上,你应该拥有应用服务的开放连接。

通过远程连接交换特定于服务的消息

在此处,你可以 ValueSet 对象的形式发送或接收通过该服务传递的消息(有关详细信息,请参阅创建和使用应用服务)。 随机数字生成器服务采用将密钥 "minvalue""maxvalue" 用作输入的两个整数、随机选择这两个整数范围内的一个整数,并通过密钥 "Result" 将其返回到调用进程。

    // create the command input
    ValueSet inputs = new ValueSet();

    // min_value and max_value vars are obtained somewhere else in the program
    inputs.Add("minvalue", min_value);
    inputs.Add("maxvalue", max_value);

    // send input and receive output in a variable
    AppServiceResponse response = await connection.SendMessageAsync(inputs);

    string result = "";
    // check that the service successfully received and processed the message
    if (response.Status == AppServiceResponseStatus.Success)
    {
        // Get the data that the service returned:
        result = response.Message["Result"] as string;
    }
}

此时你已连接到目标主设备上的应用服务、已在该设备上运行操作,并作为响应收到了客户端设备的数据。

连接的应用和设备(项目 Rome)概述
启动远程应用
创建和使用应用服务
远程系统 API 参考
远程系统示例