Skapa och använda en apptjänst i Windows App SDK

Med apptjänster kan din app tillhandahålla tjänster till andra appar. En apptjänst körs som en bakgrundsaktivitet i en separat process och exponerar en kommunikationskanal för begäran/svar. Andra appar ansluter till tjänsten med AppServiceConnection.

Important

Apptjänster kräver MSIX-paketidentitet. Både provider- och konsumentapparna måste paketeras. Opaketerade skrivbordsappar kan inte vara värd för eller ansluta till apptjänster.

Note

Windows App SDK-appar kan endast vara värd för en apptjänst som en bakgrundsaktivitet utanför processen. Microsoft.UI.Xaml.Application tillhandahåller inte någon OnBackgroundActivated-åsidosättning, och ExtendedActivationKind innehåller inte någon aktiveringstyp för apptjänst, så en Windows App SDK-app kan inte ta emot apptjänstaktivering direkt i sin egen process på samma sätt som en UWP-app kunde. Se Apptjänster i processen stöds inte för mer information.

Så här fungerar App Services

En apptjänst består av:

  1. En providerapp som deklarerar och implementerar tjänsten.
  2. En konsumentapp som ansluter till tjänsten och skickar begäranden.

Kommunikation använder ValueSet-objekt för begärande- och svarsdata.

Skapa apptjänstleverantören

Steg 1: Deklarera apptjänsten i manifestet

Lägg till ett appService tillägg till providerappens Package.appxmanifestoch ange startpunkten för bakgrundsaktivitetsprojektet som implementerar tjänsten:

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

Steg 2: Implementera tjänsten

Skapa ett separat Windows Runtime komponentprojekt och implementera IBackgroundTask. Bakgrundsaktiviteten tar slut, så det här mönstret fungerar oavsett om providerappen skapas med Windows App SDK eller 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();
    }
}

Använda apptjänsten

Skapa en AppServiceConnection och skicka begäranden från konsumentappen:

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

Leta reda på PackageFamilyName för providerappen genom att köra kommandot Get-AppxPackage -Name *ProviderApp* i PowerShell, eller kontrollera providerappens paketmanifest.

Varför tjänsten måste köras utanför processen

En apptjänsts bakgrundsaktivitet körs alltid i en egen process (eller providerappens process, endast för UWP-leverantörer). För en Windows App SDK-providerapp måste bakgrundsaktiviteten köras i en separat process, eftersom det inte finns något stöd för att appens egen process tar emot aktivering via apptjänst. Mer information finns i Processbaserade apptjänster stöds inte.