public void EnableProxyTypes()
        {
            if (CurrentServiceEndpoint == null)
            {
                throw new InvalidOperationException($"The '{nameof(CurrentServiceEndpoint)}' is NULL");
            }

            lock (this._lockObject) {
                ProxyTypesBehavior proxyTypesBehavior = this.CurrentServiceEndpoint.Behaviors.Find <ProxyTypesBehavior>();
                if (proxyTypesBehavior != null)
                {
                    this.CurrentServiceEndpoint.Behaviors.Remove(proxyTypesBehavior);
                }
                this.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            }
        }
        protected virtual IServiceConfiguration <IOrganizationService> CreateServiceConfiguration(CrmConnection connection)
        {
            var uri            = connection.ServiceUri;
            var fullServiceUri = uri.AbsolutePath.EndsWith(_organizationUri, StringComparison.OrdinalIgnoreCase)
                                ? uri
                                : new Uri(uri, uri.AbsolutePath.TrimEnd('/') + _organizationUri);

            var proxyTypesEnabled  = connection.ProxyTypesEnabled;
            var proxyTypesAssembly = connection.ProxyTypesAssembly;

            var config = ServiceConfigurationFactory.CreateConfiguration <IOrganizationService>(fullServiceUri);

            if (proxyTypesEnabled)
            {
                // configure the data contract surrogate at configuration time instead of at runtime

                var behavior = new ProxyTypesBehavior(proxyTypesAssembly) as IEndpointBehavior;

                behavior.ApplyClientBehavior(config.CurrentServiceEndpoint, null);
            }

            return(config);
        }