Ответ 1
Я думаю, что то, что вы пытаетесь выполнить, лучше всего сделать, добавив новый инициализатор канала к слушателю (-ам) службы после того, как они создан.
В принципе, вы создаете класс, который реализует этот интерфейс, а затем добавляете его на хост службы. Если вы владеете хостингом, это довольно просто:
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());
Поскольку вы используете режим экземпляра для каждого сеанса, вы получите новый канал, созданный для каждого нового сеанса, при первом подключении клиента. Диспетчер каналов - это объект, ответственный за прием вновь созданного канала и связывание его с конкретным экземпляром объекта службы (сопоставление адресов и т.д.). Он запускает каждый из пользовательских инициализаторов на новом канале до того, как ваш сервис подключится к нему.