Создание и использование службы приложений в Windows App SDK

Службы приложений позволяют приложению предоставлять службы другим приложениям. Служба приложений выполняется в качестве фоновой задачи в отдельном процессе и предоставляет канал связи с запросами и ответами. Другие приложения подключаются к службе с помощью AppServiceConnection.

Important

Для служб приложений требуется удостоверение пакета MSIX. Приложения поставщика и потребителя должны быть упакованы. Неупакованные настольные приложения не могут быть узлом служб приложений или подключаться к ним.

Note

Приложения Windows App SDK могут размещать службу приложения только как фоновую задачу, выполняемую вне процесса. Microsoft.UI.Xaml.Application не предоставляет переопределённый метод OnBackgroundActivated, а ExtendedActivationKind не включает тип активации через службу приложений, поэтому приложение Windows App SDK не может получать такую активацию напрямую в собственном процессе, как это может приложение UWP. Дополнительные сведения см. в разделе Службы приложений в процессе не поддерживаются.

Как работают службы приложений

Служба приложений состоит из следующих элементов:

  1. Приложение поставщика , которое объявляет и реализует службу.
  2. Приложение-получатель , которое подключается к службе и отправляет запросы.

Связь использует объекты ValueSet для данных запроса и ответа.

Создание поставщика службы приложений

Шаг 1. Объявление службы приложений в манифесте

Добавьте расширение appService в Package.appxmanifest приложения поставщика и укажите точку входа проекта фоновой задачи, реализующего службу:

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

Шаг 2. Реализация службы

Создайте отдельный проект компонента среда выполнения Windows и реализуйте IBackgroundTask. Фоновая задача выполняется вне процесса, поэтому этот шаблон работает независимо от того, создано ли приложение поставщика с помощью Windows App SDK или 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();
    }
}

Использование службы приложений

В потребительском приложении создайте AppServiceConnection и отправьте запросы:

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 для приложения поставщика, выполнив Get-AppxPackage -Name *ProviderApp* в PowerShell, или проверьте манифест пакета приложения поставщика.

Почему служба должна выполняться вне процесса

Фоновая задача службы приложения всегда выполняется в собственном процессе (или, только для поставщиков UWP, в процессе приложения-поставщика). Для приложения поставщика Windows App SDK фоновая задача должна выполняться вне процесса, так как для собственного процесса приложения нет поддерживаемого способа получения активации службы приложений. Дополнительные сведения см. в разделе "Службы приложений в процессе" не поддерживаются.