Kommunizieren mit einem App-Remotedienst

Sie können nicht nur eine App auf einem Remotegerät mithilfe eines URI starten, sondern auch App-Dienste auf Remotegeräten ausführen und mit ihnen kommunizieren. Jedes Windows-basierte Gerät kann als Client- oder Hostgerät verwendet werden. Dies bietet Ihnen eine nahezu unbegrenzte Anzahl von Möglichkeiten zur Interaktion mit verbundenen Geräten, ohne eine App in den Vordergrund bringen zu müssen.

Einrichten des App-Diensts auf dem Hostgerät

Um einen App-Dienst auf einem Remotegerät ausführen zu können, muss bereits ein Anbieter dieses App-Diensts auf dem Hostgerät installiert sein. In diesem Leitfaden wird die CSharp-Version des App-Dienstbeispiels "Zufallsgenerator" verwendet, das im Repository für universelle Windows-Beispiele verfügbar ist. Anleitungen zum Schreiben eines eigenen App-Diensts finden Sie unter Erstellen und Verwenden eines App-Diensts.

Gleichgültig, ob Sie einen bereits erstellten App-Dienst verwenden oder einen eigenen schreiben, Sie müssen einige Änderungen vornehmen, um den Dienst mit Remotesystemen kompatibel zu machen. Navigieren Sie in Visual Studio zum Projekt des App-Dienstanbieters (im Beispiel "AppServicesProvider" genannt), und wählen Sie dessen Datei Package.appxmanifest aus. Klicken Sie mit der rechten Maustaste, und wählen Sie Code anzeigen aus, um den gesamten Inhalt der Datei anzuzeigen. Erstellen Sie ein Extensions-Element innerhalb des Standard Application-Elements (oder suchen Sie es, wenn es bereits vorhanden ist). Erstellen Sie dann eine Erweiterung , um das Projekt als App Service zu definieren und auf das übergeordnete Projekt zu verweisen.

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

Fügen Sie neben dem AppService-Element das Attribut SupportsRemoteSystems hinzu:

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

Um Elemente in diesem uap3-Namespace verwenden zu können, müssen Sie die Namespacedefinition oben in der Manifestdatei hinzufügen, falls sie noch nicht vorhanden ist.

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

Erstellen Sie dann Ihr App-Dienstanbieterprojekt, und stellen Sie es auf den Hostgeräten bereit.

Aufrufen des App-Diensts vom Clientgerät

Das Gerät, von dem der App-Remotedienst aufgerufen werden soll, muss über eine App mit Remotesystemfunktionen verfügen. Diese können der gleichen App hinzugefügt werden, die den App-Dienst auf dem Hostgerät bereitstellt (in diesem Fall installieren Sie gleiche App auf beiden Geräten), oder in einer völlig anderen App implementiert werden.

Die folgenden using-Anweisungen werden für den Code in diesem Abschnitt benötigt, damit er wie gezeigt ausgeführt wird:

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

Instanziieren Sie zunächst ein AppServiceConnection-Objekt, als ob Sie einen App-Dienst lokal aufrufen würden. Dieser Vorgang wird in Erstellen und Verwenden eines App-Diensts ausführlicher behandelt. In diesem Beispiel ist der aufzurufende App-Dienst der Dienst für die Generierung von Zufallszahlen.

Hinweis

Es wird angenommen, dass ein RemoteSystem-Objekt bereits innerhalb des Codes geladen wurde, der die folgende Methode aufruft. Anleitungen dazu, wie Sie dies einrichten können, finden Sie unter Starten einer Remote-App.

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

Als Nächstes wird ein RemoteSystemConnectionRequest-Objekt für das vorgesehene Remotegerät erstellt. Es wird dann zum Öffnen der AppServiceConnection zu diesem Gerät verwendet. Beachten Sie, dass im folgenden Beispiel Fehlerbehandlung und Berichte erheblich vereinfacht dargestellt werden, um das Beispiel kurz zu halten.

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

An diesem Punkt sollten Sie über eine offene Verbindung zu einem App-Dienst auf einem Remotecomputer verfügen.

Exchange-Dienst-spezifische Nachrichten über die Remoteverbindung

Hier können Sie Nachrichten in Form von ValueSet-Objekten an den Dienst senden und von dem Dienst empfangen (weitere Informationen finden Sie unter Erstellen und Verwenden eines App-Diensts). Der Dienst für die Generierung von Zufallszahlen verwendet zwei Ganzzahlen mit den Schlüsseln "minvalue" und "maxvalue" als Eingaben, wählt nach dem Zufallsprinzip innerhalb dieses Bereichs eine Ganzzahl aus und gibt diese an den aufrufenden Prozess mit dem Schlüssel "Result" zurück.

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

Sie haben jetzt eine Verbindung zu einem App-Dienst auf einem aufgerufenen Hostgerät hergestellt, einen Vorgang auf diesem Gerät ausgeführt und auf dem Clientgerät als Antwort Daten empfangen.

Übersicht über verbundene Apps und Geräte (Project Rome)
Starten einer Remote-App
Erstellen und Verwenden eines App-Diensts
API-Referenz für Remotesysteme
Beispiel für Remotesysteme