Share via


Comunicarse con un servicio de aplicaciones remoto

Además de iniciar una aplicación en un dispositivo remoto mediante un URI, también puedes ejecutarla y comunicarte con los servicios de aplicaciones de dispositivos remotos. Cualquier dispositivo basado en Windows se puede usar como dispositivo cliente o host. Esto te proporciona un número casi ilimitado de formas de interactuar con dispositivos conectados sin necesidad de llevar una aplicación al primer plano.

Configurar el servicio de aplicaciones en el dispositivo host

Para ejecutar un servicio de aplicaciones en un dispositivo remoto, debes contar ya con un proveedor de dicho servicio de aplicaciones instalado en el dispositivo host. En esta guía se usará la versión CSharp del ejemplo del servicio de aplicaciones generador de números aleatorios, que está disponible en el repositorio de ejemplos universales de Windows. Para obtener instrucciones sobre cómo escribir tu propio servicio de aplicaciones, consulta Crear y consumir un servicio de aplicaciones.

Si usas un servicio de aplicaciones ya hecho o escribes el tuyo propio, deberás realizar algunas modificaciones para que el servicio sea compatible con sistemas remotos. En Visual Studio, vaya al proyecto del proveedor de servicios de aplicaciones (denominado "AppServicesProvider" en el ejemplo) y seleccione su archivo Package.appxmanifest . Haz clic con el botón secundario y selecciona Ver código para ver todo el contenido del archivo. Cree un elemento Extensions dentro del elemento Application principal (o busque si ya existe). A continuación, cree una extensión para definir el proyecto como un servicio de aplicaciones y haga referencia a su proyecto primario.

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

Junto al elemento AppService , agregue el atributo SupportsRemoteSystems :

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

Para usar elementos de este espacio de nombres uap3 , debe agregar la definición del espacio de nombres en la parte superior del archivo de manifiesto si aún no está allí.

<?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>

Después, compile el proyecto del proveedor de servicios de aplicaciones e impleméntelo en los dispositivos host.

Dirígete al servicio de aplicaciones desde el dispositivo cliente

El dispositivo desde el que se va a llamar al servicio de aplicaciones remoto necesita una aplicación con la funcionalidad de sistemas remotos. Esto se puede agregar en la misma aplicación que proporciona el servicio de aplicaciones en el dispositivo host (en cuyo caso se instala la misma aplicación en ambos dispositivos) o se puede implementar en una aplicación totalmente distinta.

Las siguientes instrucciones using son necesarias para que el código de esta sección se ejecute tal cual:

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

Primero debes crear una instancia de un objeto AppServiceConnection, como si tuvieras que llamar a un servicio de aplicaciones localmente. Este proceso se describe con más detalle en Crear y consumir un servicio de aplicaciones. En este ejemplo, el servicio de aplicaciones de destino es el servicio del generador de números aleatorios.

Nota

Se supone que ya se ha adquirido un objeto RemoteSystem por algún medio dentro del código que llamará al siguiente método. Consulta Iniciar una aplicación remota para obtener instrucciones sobre cómo configurar esta función.

// 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"
    };

Luego, se crea un objeto RemoteSystemConnectionRequest para el dispositivo remoto previsto. A continuación, se usa para abrir AppServiceConnection para ese dispositivo. Ten en cuenta que, en el siguiente ejemplo, el control y los informes de errores se simplifican por motivos de brevedad.

// 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;
}

En este punto, deberías tener una conexión abierta a un servicio de aplicaciones en un equipo remoto.

Mensajes específicos del servicio de Exchange mediante la conexión remota

Desde aquí, puedes enviar y recibir mensajes al servicio y desde el servicio en el formulario de objetos ValueSet (para obtener más información, consulta Crear y consumir un servicio de aplicaciones). El servicio de generador de números aleatorios toma dos enteros con las claves "minvalue" y "maxvalue" como entradas, selecciona aleatoriamente un número entero dentro de su intervalo y lo devuelve al proceso de llamada con la clave "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;
    }
}

Ahora que te has conectado a un servicio de aplicaciones en un dispositivo remoto host, ejecuta una operación en dicho dispositivo y los datos recibidos en tu dispositivo cliente como respuesta.

Introducción a aplicaciones y dispositivos conectados (Project Rome)
Iniciar una aplicación remota
Crear y usar un servicio de aplicación
Referencia de API de sistemas remotos
Muestra de sistemas remotos