2017-01-22 6 views
2

, 그건 서버 측이 .NET MVC을 기반으로, 프런트 엔드면 우리는 API 응답, 전에서 대기 시간 문제에 직면하고있다 AngularJS와XRM SDK를 사용하는 Dynamics CRM의 속도 저하? 우리는 <code>XRM SDK</code>를 사용하여 <code>Microsoft Dynamics CRM</code>에 연결하는 시스템을 개발하고있다

에 내장되어 있습니다. 로그인 API는 성공 또는 잘못된 응답을 검색하기 위해 적어도 1.8 초이 필요하며이 API가 가장 빠릅니다.

다른 API도 속도가 느리기 때문에이 속도 저하 원인을 파악하려고했지만 운이 없었습니다. XRM SDK, API 또는 CRM입니다.

도움이 될만한 경우

var cols = new ColumnSet("exdyn_employeecontractid", "exdyn_contractstatus"); 
      var secondEntityCols = new ColumnSet("exdyn_companyagreementid", "exdyn_agreementstatus"); 

      var filter = new FilterExpression 
      { 
       Conditions = 
       { 
        new ConditionExpression 
        { 
         AttributeName = "exdyn_employeeid", 
         Operator = ConditionOperator.Equal, 
         Values = {model.EmployeeId} 
        }, 
        new ConditionExpression 
        { 
         AttributeName = "exdyn_contractstatus", 
         Operator = ConditionOperator.Equal, 
         Values = { 3 } // approved {2} signed 
        }, 

       }, 

       FilterOperator = LogicalOperator.And 
      }; 
      var secondFilter = new FilterExpression 
      { 
       Conditions = 
       { 
        new ConditionExpression 
        { 
         AttributeName = "exdyn_agreementstatus", 
         Operator = ConditionOperator.Equal, 
         Values = { 2 } // active {2} 
        } 
       } 
      }; 

      var entity = _organizationService.GetEntityCollectionWithJoin 
       ("exdyn_employeecontract", "exdyn_companyagreement", 
       "exdyn_companyagreementid", "exdyn_companyagreementid", JoinOperator.Inner, 
       cols, secondEntityCols, filter, secondFilter).Entities.FirstOrDefault(); 

==============

코드를 사용하면 연결 :

public class WebModule : Module 
    { 
     protected override void Load(ContainerBuilder builder) 
     { 
      // Register your Web API controllers. 
      builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
      // Register your MVC controllers. 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
      // OPTIONAL: Register web abstractions like HttpContextBase. 
      builder.RegisterModule<AutofacWebTypesModule>(); 
      builder.RegisterFilterProvider(); 
      builder.Register(c => new WebConfigurationSettings()).As<IWebSettings>().SingleInstance(); 
      builder.Register(GetOrganizationServiceManagement).SingleInstance(); 
      builder.Register(GetOrganizationProxy).InstancePerRequest(); 
      builder.Register(c => new ExceptionHandler()).SingleInstance(); 

      builder.Register(c => new EmployeeService(c.Resolve<IOrganizationService>())) 
       .As<IEmployeeService>() 
       .EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 
      builder.Register(c => new AttendanceService(c.Resolve<IOrganizationService>())) 
       .As<IAttendanceService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 

      builder.Register(c => new ContractService(c.Resolve<IOrganizationService>())) 
       .As<IContractService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 

      builder.Register(c => new InquiryService(c.Resolve<IOrganizationService>(), c.Resolve<ILookupService>())) 
       .As<IInquiryService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 

      builder.Register(c => new LookupService(c.Resolve<IOrganizationService>())) 
       .As<ILookupService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 

      builder.Register(c => new LeaveRequestService(c.Resolve<IOrganizationService>(), 
       c.Resolve<IContractService>(), c.Resolve<ILookupService>())) 
       .As<ILeaveRequestService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 


      builder.Register(c => new PurchaseRequestService(c.Resolve<IOrganizationService>(), c.Resolve<ILookupService>())) 
       .As<IPurchaseRequestService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 

      builder.Register(c => new NotificationService(c.Resolve<IOrganizationService>())) 
       .As<INotificationService>().EnableInterfaceInterceptors() 
       .InterceptedBy(typeof(ExceptionHandler)) 
       .InstancePerRequest(); 
      builder.Register(c => new CacheClient()) 
       .As<ICacheClient>() 
       .SingleInstance(); 
     } 

     private static IServiceManagement<IOrganizationService> GetOrganizationServiceManagement(IComponentContext ctx) 
     { 
      var settings = ctx.Resolve<IWebSettings>(); 

      return ServiceConfigurationFactory.CreateManagement<IOrganizationService>(
         new Uri(settings.OrganizationUrl)); 
     } 

     private static IOrganizationService GetOrganizationProxy(IComponentContext ctx) 
     { 
      var svcMgmt = ctx.Resolve<IServiceManagement<IOrganizationService>>(); 
      var settings = ctx.Resolve<IWebSettings>(); 
      var credentials = new AuthenticationCredentials(); 
      credentials.ClientCredentials.UserName.UserName = settings.SystemUserName; 
      credentials.ClientCredentials.UserName.Password = settings.SystemUserPassword; 
      var authCredentials = svcMgmt.Authenticate(credentials); 
      //return new OrganizationServiceProxy(svcMgmt, authCredentials.SecurityTokenResponse); 
      return new OrganizationServiceProxy(svcMgmt, authCredentials.ClientCredentials); 
     } 

    } 
+0

온 - 프레미스 또는 온라인입니까? 비누 엔드 포인트 또는 나머지 엔드 포인트를 사용하고 있습니까? – Sxntk

+0

일부 코드를 게시해야합니다. SDK는 어떻게 사용됩니까? 연결은 어떻게 인스턴스화됩니까? 연결 문자열 형식? – dynamicallyCRM

+0

나에게 맞는 소리.내 경험에 따르면 Dynamics CRM Online은 확장 성이 뛰어나지 않습니다. 다운 될 경우 아무 것도 할 수 없습니다. SQL Server에 밑줄을 긋거나 성능이 좋지 않습니다. –

답변

1

그것은 가장 가능성이 CRM/API를이다. 피들러 (Fiddler)와 같은 것을 통해 이것을 테스트하여 요청이 만들어지고 느려지는 곳을 파악할 수 있어야합니다.

enter image description here

  1. 가 ~ 4 별도 있습니다 : 다음 볼 수

    var connection = CrmConnection.Parse(@"Url=https://ORG.crm.dynamics.com;Username=USERNAME;Password=PASSWORD"); 
    _orgService = new OrganizationService(connection); 
    
    _orgService.RetrieveMultiple(new FetchExpression(@"<fetch><entity name='account'><attribute name='accountid'/></entity></fetch>")); 
    

    피들러 확인 : 예를 들어, 다음은 SDK의 이전 버전을 사용하여 CRM 온라인 샌드 박스를 조회한다 ~ 1.5 초 걸리는 인증을 위해 클라이언트의 HTTP 요청 (이 경우 순수 O365 사용자 인 ADFS는 사용되지 않음)

  2. 최종 HTTP 요청은 5k를 반환하는 실제 쿼리입니다 계정 ID. 돌아 오는 데는 약 5 초가 걸립니다.

당신은 당신의 코드를 시간과 시간이 소요되는 위치를 볼 수있는 실제 HTTP 요청에 비교,하지만 난 그게 요청이 아닌 SDK 될 것입니다 내기 싶다면.

당신이 시도하고 쿼리 최적화하기 위해 할 수있는 일의 소수가 있습니다 만 데이터가

  • 제한의 양을 필요로 돌려주는

    1. 에 가입
    2. 확인 플러그인 RetrieveMultiple에서 실행되지 않습니다 확인 쿼리하는 엔티티의 이름.
    3. 한 번 인증하고 "연결"을 다시 사용하십시오. (사용중인 SDK의 버전과 해당 SDK의 조각에 따라 다른 방식으로 수행 할 수 있습니다. CrmServiceClient 기본적으로 캐시, 다른 연결 문자열은 Service Configuration Instance Mode과 같은 옵션이 있습니다.