Freigeben über


Kommunizieren mit einem App-Remotedienst

Zusätzlich zum Starten einer App auf einem Remotegerät mit einem URI können Sie auch App-Dienste auf Remotegeräten ausführen und kommunizieren. Jedes Windows-basierte Gerät kann entweder als Client- oder Hostgerät verwendet werden. Dadurch erhalten Sie eine nahezu unbegrenzte Anzahl von Möglichkeiten, mit verbundenen Geräten zu interagieren, ohne eine App in den Vordergrund zu bringen.

Einrichten des App-Diensts auf dem Hostgerät

Um einen App-Dienst auf einem Remotegerät auszuführen, müssen Sie bereits einen Anbieter dieses App-Diensts auf diesem Gerät installiert haben. In diesem Leitfaden wird die CSharp-Version des App-Dienstbeispiels für den Zufallszahlengenerator verwendet, das im Universellen Beispiel-Repository für Windows verfügbar ist. Anweisungen zum Schreiben Ihres eigenen App-Diensts finden Sie unter Erstellen und Nutzen eines App-Diensts.

Unabhängig davon, ob Sie einen bereits erstellten App-Dienst verwenden oder eigene Schreiben schreiben, müssen Sie einige Änderungen vornehmen, um den Dienst mit Remotesystemen kompatibel zu machen. Wechseln Sie in Visual Studio zum Projekt des App-Dienstanbieters (im Beispiel "AppServicesProvider" genannt), und wählen Sie die Datei "Package.appxmanifest " aus. Klicken Sie mit der rechten Maustaste, und wählen Sie "Code anzeigen" aus, um den vollständigen Inhalt der Datei anzuzeigen. Erstellen Sie ein Extensions-Element innerhalb des Hauptanwendungselements (oder suchen Sie es, wenn es bereits vorhanden ist). Erstellen Sie dann eine Erweiterung , um das Projekt als App-Dienst 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 zu verwenden, müssen Sie die Namespacedefinition oben in der Manifestdatei hinzufügen, wenn 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.

Ziel des App-Diensts vom Clientgerät

Das Gerät, von dem der Remote-App-Dienst aufgerufen werden soll, benötigt eine App mit Remotesystemfunktionen. Dies kann in derselben App hinzugefügt werden, die den App-Dienst auf dem Hostgerät bereitstellt (in diesem Fall würden Sie dieselbe App auf beiden Geräten installieren) oder in einer völlig anderen App implementiert.

Die folgenden using-Anweisungen sind erforderlich, damit der Code in diesem Abschnitt wie folgt ausgeführt werden kann:

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

Sie müssen zunächst ein AppServiceConnection-Objekt instanziieren, genau so, als ob Sie einen App-Dienst lokal aufrufen würden. Dieser Prozess wird in der Erstellung und Nutzung eines App-Diensts ausführlicher behandelt. In diesem Beispiel ist der app-Dienst, der als Ziel verwendet werden soll, der Zufallszahlengenerator-Dienst.

Hinweis

Es wird angenommen, dass bereits ein RemoteSystem-Objekt innerhalb des Codes abgerufen wurde, das die folgende Methode aufrufen würde. Anweisungen zum Einrichten 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 beabsichtigte Remotegerät erstellt. Anschließend wird es verwendet, um das AppServiceConnection-Element auf diesem Gerät zu öffnen. Beachten Sie, dass im folgenden Beispiel die Fehlerbehandlung und -berichterstellung aus Platzgründen erheblich vereinfacht wird.

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

Zu diesem Zeitpunkt sollten Sie über eine offene Verbindung mit einem App-Dienst auf einem Remotecomputer verfügen.

Exchange-dienstspezifische Nachrichten über die Remoteverbindung

Von hier aus können Sie Nachrichten in Form von ValueSet-Objekten an den Dienst senden und empfangen (weitere Informationen finden Sie unter Erstellen und Nutzen eines App-Diensts). Der Zufallszahlen-Generator-Dienst verwendet zwei ganze Zahlen mit den Schlüsseln "minvalue" und "maxvalue" als Eingaben, wählt zufällig eine ganze Zahl innerhalb ihres Bereichs aus und gibt ihn 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;
    }
}

Jetzt haben Sie eine Verbindung mit einem App-Dienst auf einem Zielhostgerät hergestellt, einen Vorgang auf diesem Gerät ausgeführt und als Reaktion auf Ihr Clientgerät 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