WCF InProcFactory error
        Posted  
        
            by Terence Lewis
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Terence Lewis
        
        
        
        Published on 2009-05-15T11:15:28Z
        Indexed on 
            2010/05/08
            3:58 UTC
        
        
        Read the original article
        Hit count: 547
        
I'm using IDesign's ServiceModelEx assembly to provide additional functionality over and above what's available in standard WCF.
In particular I'm making use of InProcFactory to host some WCF services within my process using Named Pipes. However, my process also declares a TCP endpoint in its configuration file, which I host and open when the process starts.
At some later point, when I try to host a second instance of this service using the InProcFactory through the named pipe (from a different service in the same process), for some reason it picks up the TCP endpoint in the configuration file and tries to re-host this endpoint, which throws an exception as the TCP port is already in use from the first hosting.
Here is the relevant code from InProcFactory.cs in ServiceModelEx:
static HostRecord GetHostRecord<S,I>() where I : class
                                       where S : class,I
{
    HostRecord hostRecord;
    if(m_Hosts.ContainsKey(typeof(S)))
    {
        hostRecord = m_Hosts[typeof(S)];
    }
    else
    {
        ServiceHost<S> host;
        if(m_Singletons.ContainsKey(typeof(S)))
        {
            S singleton = m_Singletons[typeof(S)] as S;
            Debug.Assert(singleton != null);
            host = new ServiceHost<S>(singleton,BaseAddress);
        }
        else
        {
           host = new ServiceHost<S>(BaseAddress);
        }    
        string address =  BaseAddress.ToString() + Guid.NewGuid().ToString();
        hostRecord = new HostRecord(host,address);
        m_Hosts.Add(typeof(S),hostRecord);
        host.AddServiceEndpoint(typeof(I),Binding,address);
        if(m_Throttles.ContainsKey(typeof(S)))
        {
           host.SetThrottle(m_Throttles[typeof(S)]);
        }
        // This line fails because it tries to open two endpoints, instead of just the named-pipe one
        host.Open();
    }
    return hostRecord;
}
© Stack Overflow or respective owner