Ответ на первый вопрос - да, вы все поняли правильно.
Ответ на вопрос из комментария: когда сервер посылает сообщение клиенту - он это делает по тому каналу, по которому вы ему сказали его послать. Чтобы запомнить канал к клиенту - вызовите OperationContext.Current.GetCallbackChannel
- и сохраните куда-нибудь результат. При посылке сообщения через CallbackChannel
оно пойдет по тому соединению, которое устанавливал клиент.
Если же вы просто отвечаете на клиентский запрос - то никакого дуплексного контракта не требуется. Ответ сервера всегда пойдет по тому каналу, по которому пришел запрос.