Compartilhar via


Comunicar-se com um serviço de app remoto

Além de iniciar um aplicativo em um dispositivo remoto usando um URI, você também pode executar e se comunicar com os serviços de aplicativo em dispositivos remotos. Qualquer dispositivo baseado em Windows pode ser usado como dispositivo cliente ou host. Isso oferece um número quase ilimitado de maneiras de interagir com dispositivos conectados sem a necessidade de colocar um aplicativo em primeiro plano.

Configurar o serviço de aplicativo no dispositivo host

Para executar um serviço de aplicativo em um dispositivo remoto, você já deve ter um provedor desse serviço de aplicativo instalado nesse dispositivo. Este guia usará a versão CSharp do exemplo de serviço de aplicativo Gerador de Números Aleatórios, que está disponível no repositório de exemplos universais do Windows. Para obter instruções sobre como escrever seu próprio serviço de aplicativo, consulte Criar e consumir um serviço de aplicativo.

Esteja você usando um serviço de aplicativo já criado ou escrevendo o seu próprio, precisará fazer algumas edições para tornar o serviço compatível com sistemas remotos. No Visual Studio, acesse o projeto do provedor de serviços de aplicativo (chamado "AppServicesProvider" no exemplo) e selecione seu arquivo Package.appxmanifest . Clique com o botão direito do mouse e selecione Exibir código para exibir o conteúdo completo do arquivo. Crie um elemento Extensions dentro do elemento Application principal (ou localize-o se ele já existir). Em seguida, crie uma Extensão para definir o projeto como um serviço de aplicativo e fazer referência ao projeto pai.

...
<Extensions>
    <uap:Extension Category="windows.appService" EntryPoint="RandomNumberService.RandomNumberGeneratorTask">
        <uap3:AppService Name="com.microsoft.randomnumbergenerator"/>
    </uap:Extension>
</Extensions>
...

Ao lado do elemento AppService , adicione o atributo SupportsRemoteSystems :

...
<uap3:AppService Name="com.microsoft.randomnumbergenerator" SupportsRemoteSystems="true"/>
...

Para usar elementos nesse namespace uap3 , você deve adicionar a definição de namespace na parte superior do arquivo de manifesto, se ele ainda não estiver lá.

<?xml version="1.0" encoding="utf-8"?>
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3">
  ...
</Package>

Em seguida, crie seu projeto de provedor de serviços de aplicativo e implante-o no(s) dispositivo(s) host.

Direcionar o serviço de aplicativo do dispositivo cliente

O dispositivo do qual o serviço de aplicativo remoto deve ser chamado precisa de um aplicativo com a funcionalidade Sistemas Remotos. Isso pode ser adicionado ao mesmo aplicativo que fornece o serviço de aplicativo no dispositivo host (nesse caso, você instalaria o mesmo aplicativo em ambos os dispositivos) ou implementado em um aplicativo completamente diferente.

As seguintes instruções using são necessárias para que o código nesta seção seja executado no estado em que se encontra:

using Windows.ApplicationModel.AppService;
using Windows.System.RemoteSystems;

Primeiro, você deve instanciar um objeto AppServiceConnection , como se fosse chamar um serviço de aplicativo localmente. Esse processo é abordado com mais detalhes em Criar e consumir um serviço de aplicativo. Neste exemplo, o serviço de aplicativo a ser direcionado é o serviço Gerador de Números Aleatórios.

Observação

Supõe-se que um objeto RemoteSystem já tenha sido adquirido por algum meio dentro do código que chamaria o método a seguir. Consulte Iniciar um aplicativo remoto para obter instruções sobre como configurar isso.

// This method returns an open connection to a particular app service on a remote system.
// param "remotesys" is a RemoteSystem object representing the device to connect to.
private async void openRemoteConnectionAsync(RemoteSystem remotesys)
{
    // Set up a new app service connection. The app service name and package family name that
    // are used here correspond to the AppServices UWP sample.
    AppServiceConnection connection = new AppServiceConnection
    {
        AppServiceName = "com.microsoft.randomnumbergenerator",
        PackageFamilyName = "Microsoft.SDKSamples.AppServicesProvider.CS_8wekyb3d8bbwe"
    };

Em seguida, um objeto RemoteSystemConnectionRequest é criado para o dispositivo remoto pretendido. Em seguida, ele é usado para abrir o AppServiceConnection para esse dispositivo. Observe que, no exemplo abaixo, o tratamento e o relatório de erros são bastante simplificados para fins de brevidade.

// a valid RemoteSystem object is needed before going any further
if (remotesys == null)
{
    return;
}

// Create a remote system connection request for the given remote device
RemoteSystemConnectionRequest connectionRequest = new RemoteSystemConnectionRequest(remotesys);

// "open" the AppServiceConnection using the remote request
AppServiceConnectionStatus status = await connection.OpenRemoteAsync(connectionRequest);

// only continue if the connection opened successfully
if (status != AppServiceConnectionStatus.Success)
{
    return;
}

Neste ponto, você deve ter uma conexão aberta com um serviço de aplicativo em um computador remoto.

Trocar mensagens específicas do serviço pela conexão remota

A partir daqui, você pode enviar e receber mensagens de e para o serviço na forma de objetos ValueSet (para obter mais informações, consulte Criar e consumir um serviço de aplicativo). O serviço Gerador de números aleatórios usa dois inteiros com as chaves "minvalue" e "maxvalue" , como entradas, seleciona aleatoriamente um inteiro dentro de seu intervalo e o retorna ao processo de chamada com a chave "Result".

    // create the command input
    ValueSet inputs = new ValueSet();

    // min_value and max_value vars are obtained somewhere else in the program
    inputs.Add("minvalue", min_value);
    inputs.Add("maxvalue", max_value);

    // send input and receive output in a variable
    AppServiceResponse response = await connection.SendMessageAsync(inputs);

    string result = "";
    // check that the service successfully received and processed the message
    if (response.Status == AppServiceResponseStatus.Success)
    {
        // Get the data that the service returned:
        result = response.Message["Result"] as string;
    }
}

Agora você se conectou a um serviço de aplicativo em um dispositivo host de destino, executou uma operação nesse dispositivo e recebeu dados para o dispositivo cliente em resposta.

Visão geral de aplicativos e dispositivos conectados (Project Rome)
Iniciar um aplicativo remoto
Criar e consumir um serviço de aplicativo
Referência da API de Sistemas Remotos
Exemplo de Sistemas Remotos