Erstellen und Nutzen eines App-Diensts in Windows App SDK

Mit App-Diensten können Ihre App Dienste für andere Apps bereitstellen. Ein App-Dienst wird als Hintergrundaufgabe in einem separaten Prozess ausgeführt und macht einen Kommunikationskanal für Anforderung/Antwort verfügbar. Andere Apps stellen eine Verbindung mit dem Dienst mithilfe von AppServiceConnection her.

Important

App-Dienste erfordern MSIX-Paketidentität. Sowohl die Anbieter- als auch die Consumer-Apps müssen verpackt werden. Nicht paketierte Desktop-Apps können weder App-Dienste hosten noch eine Verbindung mit ihnen herstellen.

Note

Windows App SDK Apps können einen App-Dienst nur als Hintergrundaufgabe außerhalb des Prozesses hosten. Microsoft.UI.Xaml.Application stellt keine OnBackgroundActivated-Überschreibung bereit, und ExtendedActivationKind enthält keinen Aktivierungstyp für App-Services, sodass eine Windows App SDK-App App-Service-Aktivierungen nicht direkt im eigenen Prozess verarbeiten kann, wie es bei einer UWP-App möglich ist. Weitere Informationen finden Sie unter In-Process-App-Dienste werden nicht unterstützt.

Funktionsweise von App-Diensten

Ein App-Dienst besteht aus:

  1. Eine Anbieter-App , die den Dienst deklariert und implementiert.
  2. Eine Consumer-App , die eine Verbindung mit dem Dienst herstellt und Anforderungen sendet.

Kommunikation verwendet ValueSet-Objekte für Anforderungs- und Antwortdaten.

Erstellen des App-Dienstanbieters

Schritt 1: Deklarieren des App-Diensts im Manifest

Fügen Sie dem Package.appxmanifest der Anbieter-App eine appService-Erweiterung hinzu, und geben Sie den Einstiegspunkt des Hintergrundaufgabenprojekts an, das den Dienst implementiert:

<Extensions>
  <uap:Extension Category="windows.appService">
    <uap:AppService Name="com.example.myappservice"
                    EntryPoint="MyAppService.ServiceTask" />
  </uap:Extension>
</Extensions>

Schritt 2: Implementieren des Diensts

Erstellen Sie ein separates Windows-Runtime Component-Projekt und implementieren Sie IBackgroundTask. Die Hintergrundaufgabe wird in einem separaten Prozess ausgeführt, sodass dieses Muster unabhängig davon funktioniert, ob die Anbieter-App mit dem Windows App SDK oder UWP erstellt wurde:

// MyAppService.ServiceTask, in a separate Windows Runtime Component project
public sealed class ServiceTask : IBackgroundTask
{
    private BackgroundTaskDeferral _deferral;

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        _deferral = taskInstance.GetDeferral();
        taskInstance.Canceled += OnTaskCanceled;

        var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
        if (details != null)
        {
            details.AppServiceConnection.RequestReceived += OnRequestReceived;
        }
    }

    private async void OnRequestReceived(AppServiceConnection sender,
        AppServiceRequestReceivedEventArgs args)
    {
        var deferral = args.GetDeferral();
        var response = new ValueSet();
        response.Add("result", "Hello from the service!");
        await args.Request.SendResponseAsync(response);
        deferral.Complete();
    }

    private void OnTaskCanceled(IBackgroundTaskInstance sender,
        BackgroundTaskCancellationReason reason)
    {
        _deferral?.Complete();
    }
}

App-Dienst verwenden

Erstellen Sie in der Consumer-App eine AppServiceConnection Anforderung und senden Sie diese:

using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;

private async Task CallAppServiceAsync()
{
    var connection = new AppServiceConnection
    {
        AppServiceName = "com.example.myappservice",
        PackageFamilyName = "ProviderApp_1234567890abc"
    };

    var status = await connection.OpenAsync();
    if (status != AppServiceConnectionStatus.Success)
    {
        // Handle connection failure
        return;
    }

    var request = new ValueSet
    {
        { "command", "add" },
        { "a", 5 },
        { "b", 3 }
    };

    var response = await connection.SendMessageAsync(request);
    if (response.Status == AppServiceResponseStatus.Success)
    {
        int result = (int)response.Message["result"];
        // result is 8
    }

    connection.Dispose();
}

Tip

Suchen Sie die PackageFamilyName der Anbieter-App, indem Sie Get-AppxPackage -Name *ProviderApp* in PowerShell ausführen, oder überprüfen Sie das Paketmanifest der Anbieter-App.

Warum der Dienst außerhalb des Prozesses ausgeführt werden muss

Die Hintergrundaufgabe eines App-Diensts wird immer in einem eigenen Prozess ausgeführt (oder, nur bei UWP-Anbietern, im Prozess der Anbieter-App). Für eine Windows App SDK-Provider-App muss die Hintergrundaufgabe außerhalb des Prozesses ausgeführt werden, da es keine unterstützte Möglichkeit gibt, dass der app-eigene Prozess eine App-Service-Aktivierung empfängt. Weitere Informationen finden Sie unter In-Process-App-Dienste werden nicht unterstützt.