Tworzenie i korzystanie z usługi App Service w Zestaw SDK do aplikacji systemu Windows

Usługi App Services umożliwiają aplikacji udostępnianie usług innym aplikacjom. Usługa App Service działa jako zadanie w tle w osobnym procesie i uwidacznia kanał komunikacyjny żądania/odpowiedzi. Inne aplikacje łączą się z usługą przy użyciu połączenia AppServiceConnection.

Ważna

Usługi aplikacji wymagają tożsamości pakietu MSIX. Zarówno aplikacja dostawcy, jak i aplikacja konsumenta muszą być spakowane. Niepakietowane aplikacje klasyczne nie mogą obsługiwać usług aplikacji ani nawiązywać z nimi połączeń.

Note

Aplikacje Zestaw SDK do aplikacji systemu Windows mogą obsługiwać usługę aplikacji wyłącznie jako zadanie działające poza procesem w tle. Microsoft.UI.Xaml.Applicationnie udostępnia przesłonięcia OnBackgroundActivated, a element ExtendedActivationKind nie obejmuje rodzaju aktywacji usługi aplikacji, więc aplikacja Zestaw SDK do aplikacji systemu Windows nie może odbierać aktywacji usługi aplikacji bezpośrednio we własnym procesie w taki sposób, w jaki mogła to robić aplikacja UWP. Aby uzyskać szczegółowe informacje, zobacz Usługi aplikacji w procesie nie są obsługiwane .

Jak działają usługi aplikacji

Usługa App Service składa się z następujących elementów:

  1. Aplikacja dostawcy , która deklaruje i implementuje usługę.
  2. Aplikacja konsumenta , która łączy się z usługą i wysyła żądania.

Komunikacja używa obiektów ValueSet na potrzeby danych żądania i odpowiedzi.

Utwórz dostawcę usługi aplikacji

Krok 1: Zadeklaruj usługę aplikacji w manifeście

Dodaj rozszerzenie appService do aplikacji dostawcy Package.appxmanifest i określ punkt wejścia projektu zadania w tle, który implementuje usługę:

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

Krok 2. Implementowanie usługi

Utwórz oddzielny projekt środowisko wykonawcze systemu Windows Component i zaimplementuj element IBackgroundTask. Zadanie w tle jest uruchamiane poza procesem, więc ten wzorzec działa niezależnie od tego, czy aplikacja dostawcy została utworzona przy użyciu Zestaw SDK do aplikacji systemu Windows, czy platformy 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();
    }
}

Korzystanie z usługi App Service

W aplikacji konsumenta utwórz żądania AppServiceConnection i wyślij je:

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

Wskazówka

PackageFamilyName Znajdź aplikację dostawcy, uruchamiając polecenie Get-AppxPackage -Name *ProviderApp* w programie PowerShell lub sprawdź manifest pakietu aplikacji dostawcy.

Dlaczego usługa musi działać poza procesem

Zadanie w tle usługi App Service zawsze jest uruchamiane we własnym procesie (lub w procesie aplikacji dostawcy tylko dla dostawców platformy UWP). W przypadku aplikacji dostawcy Zestaw SDK do aplikacji systemu Windows zadanie w tle musi działać poza procesem aplikacji, ponieważ nie ma obsługiwanego sposobu, aby własny proces aplikacji odbierał aktywację przez usługę aplikacji. Aby uzyskać więcej informacji, zobacz Usługi aplikacji w procesie nie są obsługiwane.