Search code examples
visual-studio-2010wcfexceptionc#-4.0

ChannelFactory`1[BLLService], cannot be modified while it is in the Opening state


I'm getting an exception in WCF. The problem is that I am randomly getting this exception in Windows service in WCF. Now since I cannot debug production server so I am using log4net for logging.

The exception is random in time and in different functions. It Occurs few in a day with almost 400 to 1000 db entries. Now here is my proxy class code where I am checking the client open state.

public static BLLServiceClient bLLServiceClient
        {
            get
            {
                if (_bLLServiceClient == null || _bLLServiceClient.State != CommunicationState.Opened)
                {
     _bLLServiceClient = new BLLServiceClient(Common.GetBinding(_settings.BLLServiceBinding), new EndpointAddress(_settings.BLLServiceAddress));                        
     _bLLServiceClient.Open();
                }                  
                return _bLLServiceClient;
            }
            set
            {
                _bLLServiceClient = value;
            }
        }

Which means if client is not in open state then open it or else return client

The exception is

SetSiteDataStatusInDatabase:  ____ The communication object, System.ServiceModel.ChannelFactory`1[BLLService], cannot be modified while it is in the Opening state.
System.ServiceModel
   at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ChannelFactory.EnsureOpened()
   at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
   at System.ServiceModel.ChannelFactory`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannelInternal()
   at System.ServiceModel.ClientBase`1.get_Channel()
   at BLLServiceClient.UpdateData(SiteData eSiteData)
   at DataHelper.SetSiteDataStatusInDatabase(SiteData oSiteData, CurrentTaskStatus newStatus)
Void ThrowIfDisposedOrImmutable()
System.Collections.ListDictionaryInternal
 Full Exception....
System.InvalidOperationException: The communication object, System.ServiceModel.ChannelFactory`1[ BLLService], cannot be modified while it is in the Opening state.
   at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ChannelFactory.EnsureOpened()
   at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
   at System.ServiceModel.ChannelFactory`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannelInternal()
   at System.ServiceModel.ClientBase`1.get_Channel()
   at Proxy.BLLService.BLLServiceClient.UpdateData(SiteData eSiteData)
   at DataHelper.SetSiteDataStatusInDatabase(SiteData oSiteData, CurrentTaskStatus newStatus) 

Tried to search but couldn't find modified type exception

Edit

After using @Agalo answer now the exception has changed to

   Exception of type 'System.OutOfMemoryException' was thrown.
System
   at System.Uri.CreateHelper(String uriString, Boolean dontEscape, UriKind uriKind, UriFormatException& e)
   at System.Uri.TryCreate(String uriString, UriKind uriKind, Uri& result)
   at System.ServiceModel.Description.NamingHelper.CheckUriParameter(String ns, String paramName)
   at System.ServiceModel.Description.MessagePartDescription..ctor(String name, String ns)
   at System.ServiceModel.Description.TypeLoader.CreateParameterPartDescription(XmlName defaultName, String defaultNS, Int32 index, ICustomAttributeProvider attrProvider, Type type)
   at System.ServiceModel.Description.TypeLoader.CreateParameterMessageDescription(ParameterInfo[] parameters, Type returnType, ICustomAttributeProvider returnAttrProvider, XmlName returnValueName, String methodName, String defaultNS, String action, XmlName wrapperName, String wrapperNamespace, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateMessageDescription(MethodInfo methodInfo, Boolean isAsync, Boolean isTask, Type taskTResult, XmlName returnValueName, String defaultNS, String action, XmlName wrapperName, String wrapperNamespace, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateOperationDescription(ContractDescription contractDescription, MethodInfo methodInfo, MessageDirection direction, ContractReflectionInfo reflectionInfo, ContractDescription declaringContract)
   at System.ServiceModel.Description.TypeLoader.CreateOperationDescriptions(ContractDescription contractDescription, ContractReflectionInfo reflectionInfo, Type contractToGetMethodsFrom, ContractDescription declaringContract, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateContractDescription(ServiceContractAttribute contractAttr, Type contractType, Type serviceType, ContractReflectionInfo& reflectionInfo, Object serviceImplementation)
   at System.ServiceModel.Description.TypeLoader.LoadContractDescriptionHelper(Type contractType, Type serviceType, Object serviceImplementation)
   at System.ServiceModel.ChannelFactory`1.CreateDescription()
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(Binding binding, EndpointAddress remoteAddress)
   at System.ServiceModel.ClientBase`1..ctor(Binding binding, EndpointAddress remoteAddress)
   at BLLServiceClient..ctor(Binding binding, EndpointAddress remoteAddress)
   at ServiceClients.get_bLLServiceClient()
   at SiteDataHelper.get_bLLServiceClient()
   at SiteDataHelper.FetchFilesListToDownload(Int32 siteDataId)
System.Uri CreateHelper(System.String, Boolean, System.UriKind, System.UriFormatException ByRef)
System.Collections.ListDictionaryInternal
 Full Exception....
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Uri.CreateHelper(String uriString, Boolean dontEscape, UriKind uriKind, UriFormatException& e)
   at System.Uri.TryCreate(String uriString, UriKind uriKind, Uri& result)
   at System.ServiceModel.Description.NamingHelper.CheckUriParameter(String ns, String paramName)
   at System.ServiceModel.Description.MessagePartDescription..ctor(String name, String ns)
   at System.ServiceModel.Description.TypeLoader.CreateParameterPartDescription(XmlName defaultName, String defaultNS, Int32 index, ICustomAttributeProvider attrProvider, Type type)
   at System.ServiceModel.Description.TypeLoader.CreateParameterMessageDescription(ParameterInfo[] parameters, Type returnType, ICustomAttributeProvider returnAttrProvider, XmlName returnValueName, String methodName, String defaultNS, String action, XmlName wrapperName, String wrapperNamespace, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateMessageDescription(MethodInfo methodInfo, Boolean isAsync, Boolean isTask, Type taskTResult, XmlName returnValueName, String defaultNS, String action, XmlName wrapperName, String wrapperNamespace, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateOperationDescription(ContractDescription contractDescription, MethodInfo methodInfo, MessageDirection direction, ContractReflectionInfo reflectionInfo, ContractDescription declaringContract)
   at System.ServiceModel.Description.TypeLoader.CreateOperationDescriptions(ContractDescription contractDescription, ContractReflectionInfo reflectionInfo, Type contractToGetMethodsFrom, ContractDescription declaringContract, MessageDirection direction)
   at System.ServiceModel.Description.TypeLoader.CreateContractDescription(ServiceContractAttribute contractAttr, Type contractType, Type serviceType, ContractReflectionInfo& reflectionInfo, Object serviceImplementation)
   at System.ServiceModel.Description.TypeLoader.LoadContractDescriptionHelper(Type contractType, Type serviceType, Object serviceImplementation)
   at System.ServiceModel.ChannelFactory`1.CreateDescription()
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(Binding binding, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(Binding binding, EndpointAddress remoteAddress)
   at System.ServiceModel.ClientBase`1..ctor(Binding binding, EndpointAddress remoteAddress)
   at BLLServiceClient..ctor(Binding binding, EndpointAddress remoteAddress)
   at ServiceClients.get_bLLServiceClient()
   at SiteDataHelper.get_bLLServiceClient()
   at SiteDataHelper.FetchFilesListToDownload(Int32 siteDataId)

Solution

  • You can try either of 2 solutions listed below

    1. In your particular case, it might be possible that the inner ChannelFactory is already in Created/Opened state and when you are trying to Open the Proxy, it is calling the Open method of channel Factory which is throwing the invalid operation exception. To Resolve this, you need to check the State of Channel Factory, before opening the Proxy. So you need to validate if the channel factory is already created, then you need not open the proxy again.

      _bLLServiceClient.ChannelFactory.State != CommunicationState.Created
      

    Modified function code

        public static BLLServiceClient bLLServiceClient
            {
                get
                {
                    if (_bLLServiceClient == null || _bLLServiceClient.State != CommunicationState.Opened 
                         || _bLLServiceClient.ChannelFactory.State != CommunicationState.Created) 
                    {
                        _bLLServiceClient = new BLLServiceClient(Common.GetBinding(_settings.BLLServiceBinding), new EndpointAddress(_settings.BLLServiceAddress));
                        _bLLServiceClient.Open();
                    }
                    return _bLLServiceClient;
                }
                set
                {
                    _bLLServiceClient = value;
                }
            }
    
    1. One of the solution, is to avoid using the Open method. When you call any WCF Service method Open call would be made internally. So It will be invoked automatically.