Comunicare con un servizio app remoto

Oltre ad avviare un'app in un dispositivo remoto usando un URI, è possibile eseguire e comunicare con i servizi app anche nei dispositivi remoti. Qualsiasi dispositivo basato su Windows può essere usato come client o dispositivo host. Questo offre un numero quasi illimitato di modi per interagire con i dispositivi connessi senza dover portare un'app in primo piano.

Configurare il servizio app nel dispositivo host

Per eseguire un servizio app in un dispositivo remoto, è necessario disporre già di un provider del servizio app installato nel dispositivo. Questa guida userà la versione CSharp dell'esempio di servizio app Generatore di numeri casuali, disponibile nel repository degli esempi universali di Windows. Per istruzioni su come scrivere un servizio app personalizzato, vedere Creare e utilizzare un servizio app.

Indipendentemente dal fatto che si usi un servizio app già creato o si scriva autonomamente, è necessario apportare alcune modifiche per rendere il servizio compatibile con i sistemi remoti. In Visual Studio passare al progetto del provider di servizi app (denominato "AppServicesProvider" nell'esempio) e selezionare il relativo file Package.appxmanifest. Fare clic con il pulsante destro del mouse e selezionare Visualizza codice per visualizzare il contenuto completo del file. Creare un elemento Extensions all'interno dell'elemento Application principale o trovarlo se esiste già. Creare quindi un'estensione per definire il progetto come servizio app e fare riferimento al progetto padre.

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

Accanto all'elemento AppService aggiungere l'attributo SupportsRemoteSystems:

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

Per usare gli elementi in questo spazio dei nomi uap3, è necessario aggiungere la definizione dello spazio dei nomi all'inizio del file manifesto, se non è già presente.

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

Compilare quindi il progetto del provider di servizi app e distribuirlo nei dispositivi host.

Impostare come destinazione il servizio app dal dispositivo client

Il dispositivo da cui deve essere chiamato il servizio app remoto richiede un'app con la funzionalità Sistemi remoti. Può essere aggiunto alla stessa app che fornisce il servizio app nel dispositivo host (nel qual caso si installa la stessa app in entrambi i dispositivi) o implementata in un'app completamente diversa.

Le seguenti istruzioni using sono necessarie affinché il codice in questa sezione venga eseguito così com'è:

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

È prima necessario creare un'istanza di un oggetto AppServiceConnection, esattamente come se fosse necessario chiamare un servizio app in locale. Questo processo è descritto in modo più dettagliato in Creare e usare un servizio app. In questo esempio, il servizio app di destinazione è il servizio generatore di numeri casuali.

Nota

Si presuppone che un oggetto RemoteSystem sia già stato acquisito da alcuni mezzi all'interno del codice che chiamerebbe il metodo seguente. Vedere Avviare un'app remota per istruzioni su come configurare questa impostazione.

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

Viene quindi creato un oggetto RemoteSystem Connessione ionRequest per il dispositivo remoto previsto. Viene quindi usato per aprire il servizio AppServiceConnection a tale dispositivo. Si noti che nell'esempio seguente la gestione degli errori e la creazione di report sono notevolmente semplificate per brevità.

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

A questo punto, è necessario avere una connessione aperta a un servizio app in un computer remoto.

Messaggi specifici del servizio exchange tramite la connessione remota

Da qui è possibile inviare e ricevere messaggi da e verso il servizio sotto forma di oggetti ValueSet per altre informazioni, vedere Creare e utilizzare un servizio app). Il servizio generatore di numeri casuali accetta due numeri interi con le chiavi "minvalue" e "maxvalue" come input seleziona in modo casuale un numero intero all'interno dell'intervallo e lo restituisce al processo chiamante con la chiave "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;
    }
}

Ora ti sei connesso a un servizio app su un dispositivo host di destinazione, hai eseguito un'operazione su quel dispositivo e hai ricevuto i dati sul tuo dispositivo client in risposta.

Panoramica app e dispositivi connessi (progetto Rome)
Avviare un'app remota
Creare e utilizzare un servizio app
Riferimento alle API di Sistemi remoti
Esempio di sistemi remoti