Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Службы приложений позволяют приложению предоставлять службы другим приложениям. Служба приложений выполняется в качестве фоновой задачи в отдельном процессе и предоставляет канал связи с запросами и ответами. Другие приложения подключаются к службе с помощью AppServiceConnection.
Important
Для служб приложений требуется удостоверение пакета MSIX. Приложения поставщика и потребителя должны быть упакованы. Неупакованные настольные приложения не могут быть узлом служб приложений или подключаться к ним.
Note
Приложения Windows App SDK могут размещать службу приложения только как фоновую задачу, выполняемую вне процесса.
Microsoft.UI.Xaml.Application не предоставляет переопределённый метод OnBackgroundActivated, а ExtendedActivationKind не включает тип активации через службу приложений, поэтому приложение Windows App SDK не может получать такую активацию напрямую в собственном процессе, как это может приложение UWP. Дополнительные сведения см. в разделе Службы приложений в процессе не поддерживаются.
Как работают службы приложений
Служба приложений состоит из следующих элементов:
- Приложение поставщика , которое объявляет и реализует службу.
- Приложение-получатель , которое подключается к службе и отправляет запросы.
Связь использует объекты 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 фоновая задача должна выполняться вне процесса, так как для собственного процесса приложения нет поддерживаемого способа получения активации службы приложений. Дополнительные сведения см. в разделе "Службы приложений в процессе" не поддерживаются.
Связанные материалы
Windows developer