Scrivere un plug-in personalizzato che riconosce Azure

 

Data di pubblicazione: gennaio 2017

Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

La scrittura di un plug-in che consente l'interazione con Microsoft Azure è simile alla scrittura di un altro plug-in Microsoft Dynamics 365. Tuttavia, oltre a richiamare tutti i metodi del servizio Web desiderati, il plug-in deve includere il codice per iniziare l'inserimento del contesto di esecuzione in Bus di servizio di Microsoft Azure.

In questo argomento

Considerazioni sulla progettazione dei plug-in

Scrivere il codice del plug-in

Registrazione del plug-in

Gestire un inserimento non riuscito nel bus di servizio

Considerazioni sulla progettazione dei plug-in

Per un plug-in che viene eseguito in modo sincrono, la progettazione consigliata è quella in cui il plug-in invia un messaggio a Microsoft Azure allo scopo di recuperare le informazioni da un'applicazione listener o da un altro servizio esterno. L'utilizzo di un contratto bidirezionale o REST nell'endpoint di Bus di servizio di Microsoft Azure consente la restituzione di una stringa di dati nel plug-in.

Non è consigliabile l'utilizzo di Bus di servizio di Microsoft Azure da parte di un plug-in sincrono per aggiornare i dati con un servizio esterno. I problemi possono sorgere se il servizio esterno diventa non disponibile o se ci sono molti dati da aggiornare. I plug-in sincroni devono essere eseguiti rapidamente e non trattenere tutti gli utenti connessi di un'organizzazione mentre viene eseguita un'operazione lunga. Inoltre, se si verifica un rollback dell'operazione corrente principale che ha richiamato il plug-in, tutte le modifiche apportate ai dati dal plug-in vengono annullate. Questo potrebbe lasciare Microsoft Dynamics 365 e un servizio esterno in uno stato non sincronizzato.

Si noti che è possibile che il plug-in sincrono registrato inserisca il contesto di esecuzione in Bus di servizio di Microsoft Azure.

Scrivere il codice del plug-in

Il codice del plug-in di esempio seguente è stato aggiunto per ottenere il provider di servizi di Microsoft Azure e iniziare l'inserimento del contesto di esecuzione nel bus di servizio chiamando Execute. Il codice di analisi è stato aggiunto per facilitare il debug del plug-in perché il plug-in deve essere eseguito in modalità sandbox.


using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.Serialization;

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

using Microsoft.Xrm.Sdk;

namespace Microsoft.Crm.Sdk.Samples
{
    /// <summary>
    /// A custom plug-in that can post the execution context of the current message to the Windows
    /// Azure Service Bus. The plug-in also demonstrates tracing which assist with
    /// debugging for plug-ins that are registered in the sandbox.
    /// </summary>
    /// <remarks>This sample requires that a service endpoint be created first, and its ID passed
    /// to the plug-in constructor through the unsecure configuration parameter when the plug-in
    /// step is registered.</remarks>
    public sealed class SandboxPlugin : IPlugin
    {
        private Guid serviceEndpointId; 

        /// <summary>
        /// Constructor.
        /// </summary>
        public SandboxPlugin(string config)
        {
            if (String.IsNullOrEmpty(config) || !Guid.TryParse(config, out serviceEndpointId))
            {
                throw new InvalidPluginExecutionException("Service endpoint ID should be passed as config.");
            }
        }

        public void Execute(IServiceProvider serviceProvider)
        {
            // Retrieve the execution context.
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            // Extract the tracing service.
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            if (tracingService == null)
                throw new InvalidPluginExecutionException("Failed to retrieve the tracing service.");

            IServiceEndpointNotificationService cloudService = (IServiceEndpointNotificationService)serviceProvider.GetService(typeof(IServiceEndpointNotificationService));
            if (cloudService == null)
                throw new InvalidPluginExecutionException("Failed to retrieve the service bus service.");

            try
            {
                tracingService.Trace("Posting the execution context.");
                string response = cloudService.Execute(new EntityReference("serviceendpoint", serviceEndpointId), context);
                if (!String.IsNullOrEmpty(response))
                {
                    tracingService.Trace("Response = {0}", response);
                }
                tracingService.Trace("Done.");
            }
            catch (Exception e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());
                throw;
            }
        }
    }
}

Nel codice del plug-in, è possibile aggiornare i dati scrivibili nel contesto prima di iniziare l'inserimento. Ad esempio, è possibile aggiungere una coppia chiave/valore alle variabili condivise nel contesto.

Registrazione del plug-in

Esistono alcune restrizioni quando si registra un plug-in personalizzato che riconosce Microsoft Azure. Il plug-in deve essere registrato per essere eseguito in modalità sandbox. Per questo motivo, il plug-in può chiamare solo i metodi di Microsoft Dynamics 365 SDK, i metodi della soluzione Microsoft Azure oppure accedere a una rete utilizzando un client Web. Non è consentito alcun altro accesso esterno, ad esempio l'accesso a un file system locale.

Per un plug-in registrato per essere eseguito in modalità asincrona, questo significa anche che l'ordine di esecuzione del plug-in rispetto ad altri plug-in asincroni non è garantito. Inoltre, i plug-in asincroni vengono sempre eseguiti dopo l'operazione principale di Microsoft Dynamics 365.

Gestire un inserimento non riuscito nel bus di servizio

Il comportamento previsto derivante dall'inserimento non riuscito nel bus di servizio dipende se il plug-in è stato registrato per l'esecuzione sincrona o asincrona. Per i plug-in asincroni, il processo di sistema che consente di inserire il contesto di esecuzione nel bus di servizio riproverà l'inserimento. Per un plug-in registrato sincrono, viene restituita un'eccezione.Ulteriori informazioni:Gestire gli errori di runtime

Importante

Solo per i plug-in registrati asincroni, quando il processo asincrono che consente di effettuare un inserimento in Bus di servizio di Microsoft Azure viene riprovato dopo l'errore di inserimento, l'intera logica del plug-in viene nuovamente eseguita. Per questo motivo, non aggiungere altre logiche al plug-in personalizzato che riconosce Microsoft Azure diverse dalla modifica del contesto e dall'inserimento nel bus di servizio.

Per l'esecuzione in modalità asincrona di un plug-in registrato, RemoteExecutionContext contenuto nel corpo del messaggio inviato tramite il bus di servizio include una proprietà OperationId e una proprietà OperationCreatedOn. Queste proprietà contengono gli stessi dati degli attributi CreatedOn e AsyncOperationId del record processo di sistema correlato (AsyncOperation). Queste proprietà aggiuntive facilitano la creazione di sequenze e il rilevamento dei duplicati se l'inserimento in Bus di servizio di Microsoft Azure deve essere riprovato.

Vedere anche

Estensioni Azure per Microsoft Dynamics 365
Utilizzo dei dati di Dynamics 365 nella soluzione Azure
Scrivere un plug-in
Isolamento di plug-in, attendibilità e statistiche
Pipeline di esecuzione evento
Registrare e distribuire plug-in

Microsoft Dynamics 365

© 2017 Microsoft. Tutti i diritti sono riservati. Copyright