다음을 통해 공유


사용자 지정 Azure 인식 플러그 인 작성

 

게시 날짜: 2017년 1월

적용 대상: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Microsoft Azure에서 작동하는 플러그 인을 작성하는 것은 다른 Microsoft Dynamics 365 플러그 인을 작성하는 것과 유사합니다. 하지만 원하는 웹 서비스 메서드를 호출하는 것 외에도 플러그 인에는 Microsoft Azure 서비스 버스에 대한 실행 컨텍스트 게시를 시작하는 코드를 포함해야 합니다.

이 항목의 내용

플러그 인 디자인 고려 사항

플러그 인 코드 작성

플러그 인 등록

실패 한 서비스 버스 게시 처리

플러그 인 디자인 고려 사항

동기적으로 실행되는 플러그 인의 경우 권장되는 디자인은 수신기 응용 프로그램 또는 다른 외부 서비스에서 정보를 검색할 용도로 메시지를 Microsoft Azure에 보내는 플러그 인에 대한 디자인입니다. 양방향 또는 Microsoft Azure 서비스 버스 끝점에서 REST 계약을 사용하면 데이터 문자열이 플러그 인에 반환됩니다.

외부 서비스로 데이터를 업데이트하기 위해 Microsoft Azure 서비스 버스를 사용하는 동기 플러그 인은 권장되지 않습니다. 외부 서비스를 사용할 수 없게 되거나 업데이트할 데이터가 많은 경우 문제가 발생할 수 있습니다. 동기 플러그 인은 시간이 많이 걸리는 작업을 수행하는 동안 빠르게 실행되어야 하므로 로그인한 조직의 모든 사용자를 유지해서는 안 됩니다. 또한 플러그 인을 호출하는 현재 핵심 작업의 롤백이 발생할 경우 플러그 인에서 수행한 모든 변경 내용은 실행 취소됩니다. 이 경우 Microsoft Dynamics 365 및 외부 서비스를 비동기화된 상태로 둘 수 있습니다.

동기 등록 플러그 인은 실행 컨텍스트를 Microsoft Azure 서비스 버스에 게시할 수 있습니다.

플러그 인 코드 작성

다음 샘플에서 플러그 인 코드는 Microsoft Azure 서비스 공급자를 얻고 Execute를 호출하여 서비스 버스에 실행 컨텍스트의 게시를 시작하도록 추가되었습니다. 플러그 인은 샌드박스에서 실행되어야 하므로 플러그 인의 디버깅을 돕기 위해 코드 추적 기능이 추가되었습니다.


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

플러그 인 코드에서 게시를 시작하기 전에 컨텍스트에서 작성 가능한 데이터를 업데이트할 수 있습니다. 예를 들어 컨텍스트에서 공유 변수에 키/값 쌍을 추가할 수 있습니다.

플러그 인 등록

Microsoft Azure 인식 사용자 지정 플러그 인을 등록할 때 몇 가지 제한 사항이 있습니다. 플러그 인은 샌드박스에서 실행하도록 등록되어야 합니다. 따라서 플러그 인은 Microsoft Dynamics 365 SDK 메서드, Microsoft Azure 솔루션 메서드를 를 호출하거나 웹 클라이언트를 사용하여 네트워크에 액세스하는 데 제한됩니다. 로컬 파일 시스템에 대한 액세스와 같은 다른 외부 액세스는 허용되지 않습니다.

비동기 모드에서 실행하도록 등록된 플러그 인의 경우 다른 비동기 플러그 인에 비해 플러그 인 실행 순서를 보장하지 않습니다. 또한 비동기 플러그 인은 Microsoft Dynamics 365 핵심 작업 후에 항상 실행됩니다.

실패 한 서비스 버스 게시 처리

실패한 서비스 버스 게시에서 예상되는 동작은 플러그 인이 동기 실행으로 등록되었는지 아니면 비동기 실행으로 등록되었는지에 따라 다릅니다. 비동기 플러그 인의 경우 실행 컨텍스트를 서비스 버스에 실제로 게시하는 시스템 작업은 게시를 다시 시도합니다. 동기 등록 플러그 인의 경우 예외가 반환됩니다.추가 정보:런타임 오류 관리

중요

비동기 등록 플러그 인의 경우에만 게시 실패 후 Microsoft Azure 서비스 버스에 게시할 비동기 작업을 다시 시도하면 전체 플러그 인 논리가 다시 실행됩니다. 따라서 컨텍스트 수정 및 서비스 버스에 게시 이외의 다른 논리를 사용자 지정 Microsoft Azure 인식 플러그 인에 추가하지 마십시오.

비동기적으로 실행하도록 등록된 플러그 인의 경우 서비스 버스로 보내는 메시지 본문에 포함된 RemoteExecutionContextOperationId 속성과 OperationCreatedOn 속성을 포함합니다. 이러한 속성에는 관련 시스템 작업(AsyncOperation) 레코드의 AsyncOperationIdCreatedOn 특성과 동일한 데이터가 들어 있습니다. 이러한 추가 속성은 Microsoft Azure 서비스 버스 게시를 다시 시도해야 하는 경우 시퀀싱 및 중복 검색을 활용합니다.

참고 항목

Microsoft Dynamics 365에 대한 Azure 확장
Azure 솔루션에서 Dynamics 365 데이터로 작업
플러그 인 작성
플러그 인 격리, 트러스트 및 통계
이벤트 실행 파이프라인
플러그 인 등록 및 배포

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 저작권 정보