Communiquer avec un service d’application distant

En plus de lancer une application sur un appareil distant avec un URI, vous pouvez exécuter des services d’application et communiquer avec eux sur des appareils distants. Un appareil Windows peut servir d’appareil client ou d’appareil hôte. Ce qui vous donne un nombre quasiment illimité de modes d’interaction avec les appareils connectés, sans avoir besoin d’amener une application au premier plan.

Configurer le service d’application sur l’appareil hôte

Pour exécuter un service d’application sur un appareil distant, un fournisseur de ce service d’application doit être installé sur cet appareil. Ce guide utilise la version CSharp de l’exemple de service d’application Générateur de nombres aléatoires, qui est disponible sur le dépôt d’exemples universels Windows. Pour obtenir des instructions sur la rédaction du code de votre service d’application, consultez Créer et utiliser un service d’application.

Que vous utilisiez un service d’application prêt à l’emploi ou créé par vos soins, vous devez lui apporter quelques modifications pour le rendre compatible avec les systèmes distants. Dans Visual Studio, accédez au projet du fournisseur app service (appelé « AppServicesProvider » dans l’exemple) et sélectionnez son fichier Package.appxmanifest . Cliquez sur le bouton droit et sélectionnez Afficher le code pour afficher le contenu du fichier. Créez un élément Extensions à l’intérieur de l’élément Application main (ou recherchez-le s’il existe déjà). Créez ensuite une extension pour définir le projet en tant que service d’application et référencer son projet parent.

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

En regard de l’élément AppService , ajoutez l’attribut SupportsRemoteSystems :

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

Pour utiliser des éléments dans cet espace de noms uap3 , vous devez ajouter la définition d’espace de noms en haut du fichier manifeste si elle n’est pas déjà là.

<?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>

Ensuite, générez votre projet de fournisseur de services d’application et déployez-le sur le ou les appareils hôtes.

Cibler le service d’application à partir de l’appareil client

L’appareil à partir duquel le service d’application distant doit être appelé a besoin de l’application avec la fonctionnalité Systèmes distants. Vous pouvez l’ajouter dans l’application qui fournit le service d’application sur l’appareil hôte (auquel cas la même application doit être installée sur les deux appareils) ou dans une autre application.

Les instructions using suivantes sont nécessaires pour que le code de cette section s’exécute tel quel :

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

Vous devez d’abord instancier un objet AppServiceConnection , comme si vous deviez appeler un service d’application localement. Ce processus est décrit plus en détail dans Créer et utiliser un service d’application. Dans cet exemple, le service d’application à cibler est le service Générateur de nombres aléatoires.

Notes

On suppose qu’un objet RemoteSystem a déjà été acquis par un moyen quelconque dans le code qui appelle la méthode suivante. Pour obtenir des instructions sur ce type de configuration, consultez Lancer une application sur un appareil distant.

// 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"
    };

Ensuite, un objet RemoteSystemConnectionRequest est créé pour l’appareil distant concerné. Il est utilisé pour ouvrir la connexion AppServiceConnection à cet appareil. Notez que dans l’exemple ci-dessous, le traitement et le signalement des erreurs sont grandement simplifiés par souci de concision.

// 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;
}

À ce stade, vous devez avoir une connexion ouverte à un service d’application sur un ordinateur distant.

Échanger des messages avec le service sur la connexion à distance

Maintenant, vous pouvez échanger des messages avec le service sous la forme d’objets ValueSet. Pour plus d’informations, consultez Créer et utiliser un service d’application. Le service Générateur de nombres aléatoires prend deux entiers avec les clés "minvalue" et "maxvalue" comme entrées, sélectionne de manière aléatoire un entier entre ces deux valeurs et le renvoie au processus appelant avec la clé "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;
    }
}

Maintenant que vous êtes connecté à un service d’application sur un appareil hôte ciblé, exécutez une opération sur cet appareil et recevez les données sur votre appareil client.

Vue d’ensemble des applications et appareils connectés (Project Rome)
Lancer une application sur un appareil distant
Créer et consommer un service d’application
Référence sur l’API Systèmes distants
Exemple de systèmes distants