Vytvoření a využití služby App Service v Windows App SDK

App Services umožňují vaší aplikaci poskytovat služby jiným aplikacím. App Service běží jako úloha na pozadí v samostatném procesu a zveřejňuje komunikační kanál žádosti a odpovědi. Jiné aplikace se ke službě připojují pomocí AppServiceConnection.

Important

Služby App Services vyžadují identitu balíčku MSIX. Aplikace poskytovatele i klientská aplikace musí být zabaleny do balíčku. Rozbalené desktopové aplikace nemůžou hostovat ani se připojovat ke službám App Services.

Note

Windows App SDK aplikace můžou hostovat službu App Service pouze jako úlohu na pozadí mimo proces. Microsoft.UI.Xaml.Application neposkytuje přepsání OnBackgroundActivated a ExtendedActivationKind neobsahuje typ aktivace App Service, takže aplikace Windows App SDK nemůže přijímat aktivaci App Service přímo ve vlastním procesu tak, jak to mohla aplikace UWP. Další informace najdete v článku Aplikační služby v procesu nejsou podporovány.

Jak fungují aplikační služby

Služba App Service se skládá z:

  1. Aplikace zprostředkovatele , která deklaruje a implementuje službu.
  2. Aplikace příjemce , která se připojuje ke službě a odesílá požadavky.

Komunikace používá objekty ValueSet pro data požadavků a odpovědí.

Vytvořte poskytovatele služby App Service

Krok 1: Deklarace služby App Service v manifestu

appService Přidejte rozšíření do aplikace Package.appxmanifestzprostředkovatele a zadejte vstupní bod projektu úlohy na pozadí, který implementuje službu:

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

Krok 2: Implementace služby

Vytvořte samostatný projekt komponenty prostředí Windows Runtime a implementujte IBackgroundTask. Úloha na pozadí běží mimo proces, takže tento model funguje bez ohledu na to, jestli je aplikace zprostředkovatele vytvořená s Windows App SDK nebo UPW:

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

Využití aplikační služby

V aplikaci příjemce vytvořte AppServiceConnection a odešlete požadavky:

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

PackageFamilyName Vyhledejte aplikaci poskytovatele spuštěním Get-AppxPackage -Name *ProviderApp* v PowerShellu nebo zkontrolujte manifest balíčku aplikace zprostředkovatele.

Proč musí služba běžet mimo proces

Úloha na pozadí služby App Service se vždy spouští ve vlastním procesu (nebo v procesu aplikace poskytovatele pouze pro poskytovatele UPW). U aplikace poskytovatele Windows App SDK musí úloha na pozadí běžet mimo proces, protože neexistuje žádný podporovaný způsob, jak vlastní proces aplikace přijímat aktivaci služby App Service. Další informace najdete v tématu Služby aplikací v procesu, které nejsou podporované.