Skriv en brugerdefineret Azure-følsom plug-in
Udgivet: januar 2017
Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Skrivning af en plug-in, som fungerer med Microsoft Azure, svarer til at skrive andre Microsoft Dynamics 365-plug-ins. Men ud over aktivering af evt. ønskede webtjenestemetoder, skal plug-in-programmet indeholde kode, der kan initiere sendingen af kørselskonteksten til Microsoft Azure-servicebus.
Dette emne indeholder
Overvejelser vedr. plug-in-design
Skriv plug-in-koden
Registrering af plug-in
Håndter en mislykket sending til servicebus
Overvejelser vedr. plug-in-design
For en plug-in, der afvikles synkront, er det anbefalede design, at den pågældende plug-in sender en meddelelse til Microsoft Azure for at hente oplysninger fra et sporerprogram eller anden ekstern tjeneste. Brug af en tovejs- eller REST-kontrakt på Microsoft Azure-servicebus-slutpunktet giver mulighed for, at en datastreng kan returneres til plug-in-programmet.
Det anbefales ikke, at lade en synkron plug-in bruge Microsoft Azure-servicebus til at opdatere data i en ekstern tjeneste. Problemer kan opstå, hvis den eksterne tjeneste bliver utilgængelig, eller hvis der er en masse data, som skal opdateres. Synkrone plug-ins skal køre hurtigt og ikke opholde alle brugere, der er logget på i en organisation, mens en langvarig handling udføres. Hvis der desuden sker en tilbageførsel af den aktuelle kernehandling, der startede plug-in-programmet, annulleres dataændringer, der er foretaget af denne plug-in. Dette kan efterlade Microsoft Dynamics 365 og en ekstern tjeneste i en ikke-synkroniseret tilstand.
Bemærk, at det er muligt for synkront registrerede plug-ins at sende kørselskonteksten til Microsoft Azure-servicebus.
Skriv plug-in-koden
Følgende eksempel på en plug-in-kode er blevet tilføjet for at hente Microsoft Azure-tjenesteudbyderen og initiere sending af kørselskonteksten til servicebussen ved at kalde Execute. Sporing af kode er blevet tilføjet for at lette fejlfinding af plug-in-programmet, fordi plug-in-programmet skal køre i sandkassen.
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;
}
}
}
}
I din plug-in-kode kan du opdatere de data, der kan skrives i konteksten, før sendingen initieres. For eksempel kan du tilføje et nøgle-/værdipar til de delte variabler i konteksten.
Registrering af plug-in
Er der nogle få begrænsninger, når du registrerer en Microsoft Azure-følsom brugerdefineret plug-in. Denne plug-in skal registreres for at kunne køres i sandkassen. Derfor kan denne plug-in kun kalde Microsoft Dynamics 365-SDK-metoder, Microsoft Azure-løsningsmetoder eller få adgang til et netværk, der bruger en webklient. Ingen anden ekstern adgang, såsom adgang til et lokalt filsystem, er tilladt.
For en plug-in, der er registreret til kørsel i asynkron tilstand, betyder det også, at kørselsrækkefølgen af plug-ins sammenlignet med andre asynkrone plug-ins ikke er garanteret. Desuden køres asynkrone plug-ins altid efter Microsoft Dynamics 365-kernehandlingen.
Håndter en mislykket sending til servicebus
Den forventede funktionsmåde fra en mislykket sending til servicebus er afhængig af, om plug-in-programmet var registreret til synkron eller asynkron kørsel. For asynkrone plug-ins forsøger det systemjob, der rent faktisk sender kørselskonteksten til servicebussen, at sende igen. For en synkront registreret plug-in returneres en undtagelse.Flere oplysninger:Administration af runtime-fejl
Vigtigt
Når det drejer sig om asynkront registrerede plug-ins, køres hele plug-in logikken igen, når det asynkrone job, der sendes til Microsoft Azure-servicebus, er forsøgt kørt igen efter en mislykket sending. Derfor skal du ikke tilføje anden logik til den brugerdefinerede Microsoft Azure-følsomme plug-in end blot at ændre konteksten og sende til servicebussen.
For en plug-in, der er registreret til at køre asynkront, inkluderer den RemoteExecutionContext, der er indeholdt i brødteksten i den meddelelse, der sendes via servicebussen, en OperationId-egenskab og en OperationCreatedOn-egenskab. Disse egenskaber kan indeholde de samme data som attributterne AsyncOperationId og CreatedOn for den relaterede systemjobpost (AsyncOperation). Disse yderligere egenskaber gør det lette at sætte opgaver i rækkefølge og registrere dubletter, hvis sendingen til Microsoft Azure-servicebus skal forsøges igen.
Se også
Azure-udvidelser til Microsoft Dynamics 365
Arbejde med Dynamics 365-data i din Azure-løsning
Skriv en plug-in
Plug-in-isolation, -tillidsforhold og -statistik
Pipeline for hændelseskørsel
Registrere og installere plug-ins
Microsoft Dynamics 365
© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret