Поделиться через


Обмен данными с удаленной службой приложений

Помимо запуска приложения на удаленном устройстве с помощью 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 удаленных систем
Пример удаленной системы