Een app-service maken en gebruiken in Windows App SDK

Met App Services kunt u uw app services bieden aan andere apps. Een App Service wordt uitgevoerd als achtergrondtaak in een afzonderlijk proces en maakt een communicatiekanaal voor aanvragen/antwoorden beschikbaar. Andere apps maken verbinding met de service met behulp van AppServiceConnection.

Important

Voor App Services is een MSIX-pakketidentiteit vereist. Zowel de provider- als consumenten-apps moeten worden verpakt. Uitgepakte bureaublad-apps kunnen geen app-services hosten of er verbinding mee maken.

Note

Windows App SDK-apps kunnen een app-service alleen hosten als een achtergrondtaak buiten proces. Microsoft.UI.Xaml.Application biedt geen OnBackgroundActivated-override en ExtendedActivationKind bevat geen app-service-activeringstype, dus een Windows App SDK-app kan app-service-activatie niet rechtstreeks in zijn eigen proces ontvangen op dezelfde manier als een UWP-app dat wel kan. Zie In-process app-services worden niet ondersteund voor meer informatie.

Hoe app-services werken

Een app-service bestaat uit:

  1. Een provider-app die de service declareert en implementeert.
  2. Een consumenten-app die verbinding maakt met de service en aanvragen verzendt.

Communicatie maakt gebruik van ValueSet-objecten voor aanvraag- en antwoordgegevens.

De app-serviceprovider maken

Stap 1: De app-service declareren in het manifest

Voeg een appService extensie toe aan de provider-app Package.appxmanifesten geef het toegangspunt op van het achtergrondtaakproject waarmee de service wordt geïmplementeerd:

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

Stap 2: de service implementeren

Maak een afzonderlijk Windows Runtime Component-project en implementeer IBackgroundTask. De achtergrondtaak wordt buiten het proces uitgevoerd, dus dit patroon werkt ongeacht of de provider-app is gebouwd met de Windows App SDK of UWP:

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

De app-service gebruiken

Maak vanuit de consumenten-app een AppServiceConnection aanvraag en verzend deze:

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

Zoek de PackageFamilyName van de provider-app door Get-AppxPackage -Name *ProviderApp* uit te voeren in PowerShell, of controleer het pakketmanifest van de provider-app.

Waarom de service buiten het proces moet worden uitgevoerd

De achtergrondtaak van een app-service wordt altijd uitgevoerd in een eigen proces (of het proces van de provider-app, alleen voor UWP-providers). Voor een Windows App SDK-provider-app moet de achtergrondtaak buiten het proces worden uitgevoerd, omdat er geen ondersteunde manier is waarop het eigen proces van de app app-serviceactivering kan ontvangen. Zie In-process app-services worden niet ondersteund voor meer informatie.