Можете ли вы сделать NetTcpBinding в коде? Тебе следует?

WCF новичок здесь... Я пытаюсь самостоятельно разместить службу WCF с помощью NetTcpBinding. Основываясь на учебном пособии MSDN "Как сделать" , я выполнил всю привязку кода, после чего я изменил ее с WsHttpBinding на NetTcpBinding и теперь выглядит например:

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService");
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress);
try {
  var binding = new NetTcpBinding();
  binding.Security.Mode = SecurityMode.Message;
  selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService");
  selfHost.Open();
  Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri);
  Console.WriteLine("Press <ENTER> to terminate service.");
  Console.WriteLine();
  Console.ReadLine();

  selfHost.Close();
} catch (CommunicationException ce) {
  Console.WriteLine("An exception occurred: {0}", ce.Message);
  selfHost.Abort();
}

В то время в учебнике говорится, что вы должны запустить svcutil.exe для создания прокси для клиента... но поскольку я переключился на NetTcpBinding, svcutil больше не работает - не удается обнаружить мой сервис. Я искал эту проблему и обнаружил, что каждый отдельный пример NetTcpBinding делает настройку в файле app.config, а не в коде, и все они добавляют конечную точку, называемую "Mex", с обязательным типом "mexTcpBinding". Кажется, что нет никакого эквивалента этого кода.

Итак, мне нужно изменить проект, чтобы использовать app.config, и отказаться от подхода на основе кода? Может ли кто-нибудь объяснить мне, что такое Мекс, зачем мне это нужно, и почему его (по-видимому) нельзя вызвать в коде - или если он может, как или почему он обескуражен? В общем, когда лучше использовать app.config и когда код для служб WCF?

Ответ 1

Если вы используете netTcpBinding - и в локальной LAN-среде "позади корпоративного брандмауэра", это определенно отличная идея - вам также нужно выставить конечную точку MEX (обмен метаданными) с помощью mexTcpBinding чтобы svcutil мог обнаружить и найти эту службу.

MEX = Метаданные Exchange - это механизм, который WCF использует для "публичной рекламы", как выглядит служба. Если у вас конечная точка MEX, то утилиты типа svcutil могут запрашивать и "обнаруживать" службу, например. узнать обо всех методах обслуживания, которые он предоставляет, о параметрах, которые он ожидает получить и т.д.

Чтобы добавить конечную точку MEX, вы также можете использовать код! Что-то вроде этого фрагмента:

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");

Без MEX вам нужно как-то "сказать" клиенту, пытающемуся использовать вашу услугу, то, что предлагает ваша услуга, чтобы клиент мог убедиться в правильности соответствующих методов.