Partager via


Communiquer avec un service d’application distant

Outre le lancement d’une application sur un appareil distant à l’aide d’un URI, vous pouvez également exécuter et communiquer avec les services d’application sur des appareils distants. Tout appareil Windows peut être utilisé en tant que client ou appareil hôte. Cela vous donne un nombre presque illimité de façons d’interagir avec les appareils connectés sans avoir à apporter 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, vous devez déjà disposer d’un fournisseur de ce service d’application installé sur cet appareil. Ce guide utilise la version CSharp de l’exemple de service d’application Générateur de nombres aléatoires, disponible dans le référentiel d’exemples universels Windows. Pour obtenir des instructions sur l’écriture de votre propre service d’application, consultez Créer et consommer un service d’application.

Que vous utilisiez un service d’application déjà fait ou que vous écriviez votre propre service, vous devrez apporter quelques modifications afin de rendre le service 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 avec le bouton droit et sélectionnez Afficher le code pour afficher le contenu complet du fichier. Créez un élément Extensions à l’intérieur de l’élément Application principal (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érencez 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 de l’espace de noms en haut du fichier manifeste s’il n’y figure pas déjà.

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

Créez ensuite votre projet de fournisseur d’applications 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 d’une application avec la fonctionnalité Systèmes distants. Cela peut être ajouté à la même application qui fournit le service d’application sur l’appareil hôte (auquel cas vous installeriez la même application sur les deux appareils) ou implémentée dans une application complètement différente.

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

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 abordé plus en détail dans Créer et consommer un service d’application. Dans cet exemple, le service d’application à cibler est le service Générateur de nombres aléatoires.

Remarque

Il est supposé qu’un objet RemoteSystem a déjà été acquis par certains moyens dans le code qui appellerait la méthode suivante. Consultez Lancer une application distante pour obtenir des instructions sur la configuration de ce paramètre.

// 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 prévu. Il est ensuite utilisé pour ouvrir AppServiceConnection sur cet appareil. Notez que dans l’exemple ci-dessous, la gestion des erreurs et la création de rapports sont considérablement simplifiées pour la 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 disposer d’une connexion ouverte à un service d’application sur un ordinateur distant.

Échanger des messages spécifiques au service via la connexion à distance

À partir de là, vous pouvez envoyer et recevoir des messages vers et depuis le service sous la forme d’objets ValueSet (pour plus d’informations, consultez Créer et consommer un service d’application). Le service générateur de nombres aléatoires prend deux entiers avec les clés "minvalue" et "maxvalue" en tant qu’entrées, sélectionne aléatoirement un entier dans leur plage et le retourne 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;
    }
}

Vous êtes maintenant connecté à un service d’application sur un appareil hôte ciblé, exécutez une opération sur cet appareil et recevez des données sur votre appareil client en réponse.

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