Ejemplo: Acceso web desde un complemento

En este ejemplo se muestra cómo escribir un complemento que tiene acceso a recursos en la red como un servicio web o fuente. También demuestra cómo limitar la duración de tiempo permitida para esta llamada.

Cómo ejecutar esta muestra

  1. Descargar o clonar el informe de Muestras para que tenga una copia local. Este ejemplo se encuentra en PowerApps-Samples-master\dataverse\orgsvc\C#\WebAccessPlugin.
  2. Hay dos diferentes ejemplos de clase de complemento:
  3. Abra la solución de ejemplo en Visual Studio, vaya a las propiedades del proyecto y comprueba que el ensamblado se firmará durante la compilación. Presione la F6 para compilar el ensamblado del ejemplo (WebAccessPlugin.dll).
  4. Ejecute la herramienta de registro de complementos y registre el ensamblado en el espacio aislado y la base de datos del servidor de Microsoft Dataverse.
  5. Para cualquier tipo de complemento, al registrar un paso, especifique una cadena de URI web (es decir, https://www.microsoft.com) en la columna de configuración no segura.
    • Si no se proporciona un valor, se usará el predeterminado https://www.bing.com.
  6. Utilice una aplicación o escriba código para realizar la operación adecuada para invocar el mensaje y la solicitud de tabla en los que registró el complemento.
  7. Cuando el complemento se ejecuta, si la duración de la llamada supera el límite de 15 segundos, lanzará un error. En caso contrario deberá tener éxito.
  8. Cuando haya terminado con la prueba, cancele el registro del ensamblado y el paso.

Qué hace este ejemplo

Cuando se ejecuta, el complemento descarga los datos de la página web de la dirección de servicio web especificada (o la dirección predeterminada). Si la solicitud excede el límite de 15 segundos, arrojará una InvalidPluginExecutionException y escriba los detalles en el registro de seguimiento del complemento.

  • Si el complemento WebClientPlugin falla, escribirá algo como lo siguiente en el registro de seguimiento del complemento:

    Downloading the target URI: https://www.bing.com
    Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: The timeout elapsed while attempting to issue the request. ---> System.Net.WebException: The operation has timed out
      at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
      at System.Net.WebClient.DownloadData(Uri address)
      at PowerApps.Samples.WebClientPlugin.Execute(IServiceProvider serviceProvider)
      --- End of inner exception stack trace ---
      at PowerApps.Samples.WebClientPlugin.Execute(IServiceProvider serviceProvider)
    
  • Si el complemento HttpClientPlugin falla, escribirá algo como lo siguiente en el registro de seguimiento del complemento:

    Downloading the target URI: https://www.bing.com
    Inner Exceptions:
      Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled.
    Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: An exception occurred while attempting to issue the request.
       at PowerApps.Samples.HttpClientPlugin.Execute(IServiceProvider serviceProvider)
    

    TaskCanceledException es un tanto ambiguo sobre la causa de la tarea que es cancelada. Para obtener una solución más completa que muestre cómo detectar explícitamente errores debidos tiempos de temporización, vea esta entrada de blog: Mejor control de tiempos de espera con HttpClient.

Cómo funciona esta muestra

Para simular el escenario descrito en Qué hace este ejemplo, el ejemplo hará lo siguiente:

Configuración

  1. Comprueba el parámetro de configuración insegura del constructor para un valor de dirección web; de lo contrario, se utiliza el valor predeterminado.
  2. En función de qué complemento esté registrado, el método Execute del complemento utiliza Clase WebClient o la Clase HttpClient para descargar datos de la página web.
  3. Si la llamada excede la duración de 15 segundos especificada, se produce una InvalidPluginExecutionException y los detalles sobre el error se escribirán en el registro de seguimiento del complemento.

Demostración

Complemento WebClientPlugin

  1. Utiliza una clase CustomWebClient derivada para etablecer la Propiedad WebRequest.Timeout que no está disponible en la clase WebClient.

     /// <summary>
     /// A class derived from WebClient with 15 second timeout and KeepAlive disabled
     /// </summary>
     public class CustomWebClient : WebClient
     {
       protected override WebRequest GetWebRequest(Uri address)
       {
         HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
         if (request != null)
         {
           request.Timeout = 15000; //15 Seconds
           request.KeepAlive = false;
    
         }
         return request;
       }
     }
    
  2. Utiliza el Método WebClient.DownloadData para descargar los datos del recurso.

  3. Muestra cómo analizar la Clase WebException esperada y usar la Propiedad Status para determinar si la causa del error fue un tiempo de espera.

Complemento HttpClientPlugin

  1. Utiliza la Clase HttpClient y establece la Propiedad Timeout para limitar el tiempo permitido para que la operación se complete.
  2. Captura la Clase AggregateException esperada y examina las excepciones internas para la TaskCanceledException esperada

Vea también

Acceso a recursos web externos
Registro de un complemento

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).