Creare e usare un servizio app in SDK per app di Windows

I servizi app consentono all'app di fornire servizi ad altre app. Un servizio app viene eseguito come attività in background in un processo separato ed espone un canale di comunicazione di richiesta/risposta. Altre app si connettono al servizio usando AppServiceConnection.

Importante

I servizi app richiedono l'identità del pacchetto MSIX. Sia il provider che le app consumer devono essere inseriti in un pacchetto. Le app desktop non in pacchetto non possono ospitare o connettersi ai servizi app.

Note

Le app di SDK per app di Windows possono ospitare un servizio app solo come attività in background out-of-process. Microsoft.UI.Xaml.Applicationnon fornisce un OnBackgroundActivated override e ExtendedActivationKind non include un tipo di attivazione del servizio app, quindi un'app SDK per app di Windows non può ricevere l'attivazione del servizio app direttamente nel proprio processo nel modo in cui un'app UWP potrebbe. Per dettagli, vedere I servizi app in-process non sono supportati.

Funzionamento dei servizi app

Un servizio app è costituito da:

  1. Un'app del provider che dichiara e implementa il servizio.
  2. Un'app consumer che si connette al servizio e invia richieste.

La comunicazione usa oggetti ValueSet per i dati di richiesta e risposta.

Crea il provider di servizi app

Passaggio 1: Dichiarare il servizio app nel manifesto

Aggiungere un'estensione appService all'app del Package.appxmanifestprovider e specificare il punto di ingresso del progetto di attività in background che implementa il servizio:

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

Passaggio 2: Implementare il servizio

Creare un progetto separato di componente Windows Runtime e implementare IBackgroundTask. L'attività in background viene eseguita out-of-process, quindi questo modello funziona se l'app del provider viene compilata con la SDK per app di Windows o la piattaforma 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();
    }
}

Utilizzare il servizio app

Dall'app consumer, crea un AppServiceConnection e invia richieste:

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

Trova il PackageFamilyName per l'app del provider eseguendo Get-AppxPackage -Name *ProviderApp* in PowerShell oppure controllando il manifest del pacchetto dell'app del provider.

Perché il servizio deve essere eseguito fuori processo

L'attività in background di un servizio app viene sempre eseguita in un proprio processo (o nel processo dell'app del provider, solo per i provider UWP). Per un'app provider per SDK per app di Windows, l'attività in background deve essere eseguita in un processo separato perché non è previsto alcun modo supportato che consenta al processo dell'app di ricevere l'attivazione del servizio app. Per ulteriori informazioni, vedere I servizi app in-process non sono supportati.