在 Windows 應用程式 SDK 中建立並使用應用程式服務

App Services 讓你的 App 為其他 App 提供服務。 應用程式服務作為獨立程序中的背景任務執行,並暴露請求/回應通訊通道。 其他應用程式則使用 AppServiceConnection 連接服務。

Important

應用程式服務需要 MSIX 套件的身份。 服務提供者應用程式和用戶端應用程式都必須封裝。 未封裝的桌面應用程式無法主機或連接應用程式服務。

Note

Windows 應用程式 SDK 應用程式只能作為一個未完成的背景任務來承載應用程式服務。 Microsoft.UI.Xaml.Application不提供OnBackgroundActivated覆寫,且 ExtendedActivationKind 不包含應用程式服務啟用類型,因此 Windows 應用程式 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>

步驟二:實作服務

建立一個獨立的 Windows 執行階段 元件專案並實作 IBackgroundTask。 背景任務會以非流程方式執行,因此無論提供者應用程式是使用 Windows 應用程式 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

執行 PowerShell 中的 Get-AppxPackage -Name *ProviderApp* 以尋找提供者應用程式的 PackageFamilyName,或查看提供者應用程式的套件資訊清單。

為何服務必須在處理序外執行

應用程式服務的背景工作一律在其自身的行程中執行(但若僅限 UWP 提供者,則會在提供者應用程式的行程中執行)。 對於 Windows 應用程式 SDK 提供者應用程式,背景任務必須在程序外執行,因為應用程式自身的程序無法接收應用程式服務啟用。 更多資訊請參閱「 未支援處理中應用程式服務」。