Monday, July 8, 2013

WCF Endpoint and Binding by coding.


namespace ORS.SAMPLE.Base.Repository
{
    public class SAMPLEFactory : ISAMPLEServiceFactoryIDisposable
    {
        private bool _disposed;
        private ChannelFactory<ISAMPLESubject> factory;
        /// <summary>
        /// Constructor to initialize factory
        /// </summary>
        public SAMPLESubjectServiceFactory()
        {
          

Binding binding = null;
           
Uri address = null;
           

ProcessConfig.ResolveEndpoint("SAMPLESubjectServiceProxy.ISAMPLESubject"out address, out binding);
           

factory = new ChannelFactory<ISAMPLESubject>(binding, address.ToString());
        
   // Based on http://stackoverflow.com/questions/4812668/how-to-add-maxitemsinobjectgraph-programmatically-without-using-configuration-fi
 foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
            {
                var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
                if (dataContractBehavior != null)
                {
                    dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
                }
            }
        }
       


        /// <summary>
        /// Factory class
        /// </summary>
        /// <returns></returns>
        public ChannelFactory<IFuseSubject> Create()
        {
            return factory;
        }
       


        /// <summary>
        /// Close the factory
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
           {
                if (disposing)
                {
                    if (factory != null) factory.Close();
                }
                factory = null;
                _disposed = true;
            }
        }
    }
}

----------------------------------
----------------------------------

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.ServiceModel.Configuration;

namespace ABIM.BusinessService.Home
{
    public static class ProcessConfig
    {
        private static System.ServiceModel.Configuration.BindingsSection GetBindingSection()
        {
            return ConfigurationManager.GetSection("system.serviceModel/bindings") as System.ServiceModel.Configuration.BindingsSection;
        }

        public static Binding ResolveBinding(string name)
        {
            System.ServiceModel.Configuration.BindingsSection section = GetBindingSection();

            foreach (var bindingCollection in section.BindingCollections)
            {
                for (int i = 0; i < bindingCollection.ConfiguredBindings.Count; i++)
                {
                    if (name.Equals(bindingCollection.ConfiguredBindings[i].Name, StringComparison.CurrentCultureIgnoreCase))
                    {
                        var bindingElement = bindingCollection.ConfiguredBindings[i];
                        var binding = (Binding)Activator.CreateInstance(bindingCollection.BindingType);
                        binding.Name = bindingElement.Name;
                        bindingElement.ApplyConfiguration(binding);
                        return binding;
                    }
                }
            }
            return null;
        }

        private static ClientSection GetClientSection()
        {
            return ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
        }

        public static void ResolveEndpoint(string contract, out Uri host, out Binding binding)
        {
            host = null;
            binding = null;
            ClientSection clientSection = GetClientSection();
            ChannelEndpointElementCollection endpointCollection = clientSection.ElementInformation.Properties[string.Empty].Value as ChannelEndpointElementCollection;
            foreach (ChannelEndpointElement endpointElement in endpointCollection)
            {
                if (contract.Equals(endpointElement.Contract, StringComparison.CurrentCultureIgnoreCase))
                {
                    host = endpointElement.Address;
                    binding = ResolveBinding(endpointElement.BindingConfiguration);
                    return;
                }
            }
        }
    }

}









No comments:

Post a Comment