Обмен данными с удаленной службой приложений
Помимо запуска приложения на удаленном устройстве с помощью URI, можно также запускать и взаимодействовать со службами приложений на удаленных устройствах. Любое устройство под управлением Windows можно использовать как клиент, так и хост-устройство. Это дает почти неограниченное количество способов взаимодействия с подключенными устройствами без необходимости переносить приложение на передний план.
Настройка службы приложений на хост-устройстве
Чтобы запустить службу приложений на удаленном устройстве, на этом устройстве уже должен быть установлен поставщик этой службы приложений. В этом руководстве будет использоваться версия CSharp образца службы приложений генератора случайных чисел, которая доступна в репозитории универсальных примеров Windows. Инструкции по написанию собственной службы приложений см. в статье "Создание и использование службы приложений".
Независимо от того, используете ли вы уже созданную службу приложений или пишете собственные, необходимо внести несколько изменений, чтобы сделать службу совместимой с удаленными системами. В Visual Studio перейдите к проекту поставщика службы приложений (с именем AppServicesProvider в примере) и выберите его файл Package.appxmanifest . Щелкните правой кнопкой мыши и выберите команду "Просмотреть код ", чтобы просмотреть полное содержимое файла. Создайте элемент Extensions внутри основного элемента Application (или найдите его, если оно уже существует). Затем создайте расширение , чтобы определить проект в качестве службы приложений и ссылаться на его родительский проект.
...
<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 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;
}
На этом этапе у вас должно быть открытое подключение к службе приложений на удаленном компьютере.
Сообщения, относящиеся к службе Exchange, по удаленному подключению
Здесь вы можете отправлять и получать сообщения из службы в виде объектов 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;
}
}
Теперь вы подключились к службе приложений на целевом хост-устройстве, запустите операцию на этом устройстве и получили данные на клиентском устройстве в ответ.
См. также
Общие сведения о подключенных приложениях и устройствах (Project Rome)
Запуск удаленного приложения
Создание и использование службы приложений
Справочник по API удаленных систем
Пример удаленной системы