Можете ли вы сделать 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 вам нужно как-то "сказать" клиенту, пытающемуся использовать вашу услугу, то, что предлагает ваша услуга, чтобы клиент мог убедиться в правильности соответствующих методов.