Я думаю, что то, что вы пытаетесь выполнить, лучше всего сделать, добавив новый инициализатор канала к слушателям службы после их создания.
По сути, вы создаете класс, который реализует этот интерфейс, а затем добавляете его на хост службы. Если вы являетесь хостингом, это довольно просто:
public class MyHook : IChannelInitializer
{
public void Initialize(IClientChannel channel)
{
// Do whatever.
}
}
var host = new ServiceHost(typeof(MyService), MYBASEADDRESS);
host.AddServiceEndpoint(typeof(IMyService), new WSHttpBinding(), MYSERVICEADDRESS);
host.Open();
// There will be one per endpoint; you can enumerate them if needed etc.
var dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher;
dispatcher.ChannelInitializers.Add(new MyHook());
Поскольку вы используете режим экземпляра для каждого сеанса, вы получите новый канал, созданный для каждого нового сеанса, при первом подключении клиента. Диспетчер каналов - это объект, который отвечает за захват вновь созданного канала и связывание его с конкретным экземпляром объекта службы (выполняет сопоставление адресов и т. Д.). Он будет запускать каждый из пользовательских инициализаторов на новом канале, прежде чем ваш сервис будет подключен к нему.