与远程应用服务通信
除了在远程设备上使用 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;
}
}
此时你已连接到目标主设备上的应用服务、已在该设备上运行操作,并作为响应收到了客户端设备的数据。