Можете ли вы сделать NetTcpBinding в коде?Тебе следует? - PullRequest
13 голосов
/ 26 декабря 2010

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

1 Ответ

19 голосов
/ 26 декабря 2010

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

MEX = Обмен метаданными - это механизм, который WCF использует для "публичной рекламы" того, как выглядит служба.Если у вас есть конечная точка MEX, то такие утилиты, как svcutil, могут запрашивать и «обнаруживать» службу, например, узнавать обо всех методах службы, которые она предоставляет, о параметрах, которые она ожидает получить, и т. Д.Чтобы добавить конечную точку MEX, вы также можете использовать код!Что-то вроде этого фрагмента:

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

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

...