namespace ORS.SAMPLE.Base.Repository
{
public class SAMPLEFactory : ISAMPLEServiceFactory, IDisposable
{
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.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