Пробую работать с WCF. Создал службу, и хочу в клиенте ее добавить (Добавить ссылку на службу -> вставляю адрес). Но почему-то выдает ошибку. Службы все на localhost. Сторонние службы из интернета добавляет нормально. Перед добавлением уже службу запустил даже. Если в клиенте создать фабрику, то служба работает.
Код службы (реализуется интерфейс в котором один метод string Get(string city); для теста)
class Program
{
static void Main(string[] args)
{
Console.Title = "Сервис погоды";
Console.ForegroundColor = ConsoleColor.Green;
Uri address = new Uri("net.tcp://127.0.0.1:6000/Icontract"); // ADDRESS
NetTcpBinding binding = new NetTcpBinding(); // BINDING
Type construct = typeof(IWtServiceContract); // CONTRACT;
ServiceHost host = new ServiceHost(typeof(CitiesWheather));
host.AddServiceEndpoint(construct, binding, address);
try
{
host.Open();
Console.WriteLine("Сервис запущен!");
}
catch (Exception err)
{
Console.WriteLine(err.Message);
host.Close();
}
Console.ReadKey();
}
}
Студия использует специальный протокол для получения метаданных сервиса - WS-MEX. Как я вижу, вы его в своем контракте IWtServiceContract не реализовали - потому студия и не может ничего сделать.
К счастью, реализовывать его и не надо - достаточно добавить дополнительную конечную точку, где вы будете публиковать метаданные.
Для начала, понадобится добавить вашей службе ServiceMetadataBehavior:
host.Description.Behaviors.Add(new ServiceMetadataBehavior());
Теперь можно добавлять конечные точки:
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "net.tcp://127.0.0.1:6000/Icontract/mex");
Отмечу, что адрес конечной точки для публикации метаданных не может совпадать с основным адресом, потому что у них разные привязки - но по соглашению можно добавить в конец URI "/mex". Студия достаточно умная чтобы добавлять этот суффикс самостоятельно при попытке создания клиента.
Тем не менее, ничто не мешает использовать совершенно другой URI или даже другой протокол. Например, можно опубликовать метаданные по HTTP вот так:
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "http://127.0.0.1/Icontract");
Также можно вместо использования WS-MEX использовать WSDL. Для этого у ServiceMetadataBehavior есть свойства HttpGetEnabled и HttpGetUrl:
host.Description.Behaviors.Add(new ServiceMetadataBehavior
{
HttpGetEnabled = true,
HttpGetUrl = new Uri("http://127.0.0.1/Icontract"),
});
В этом случае страницу http://127.0.0.1/Icontract можно будет открыть из браузера и увидеть там WSDL-описание. Студия также умеет генерировать клиент по такому описанию. А если дописать в конец URL параметр ?singleWsdl - то такое описание можно будет скачать в виде одного файла и передать другому разработчику.
Все эти способы не являются взаимоисключающими - их можно использовать хоть все три вместе:
host.Description.Behaviors.Add(new ServiceMetadataBehavior
{
HttpGetEnabled = true,
HttpGetUrl = new Uri("http://127.0.0.1/Icontract"),
});
host.AddServiceEndpoint(typeof(IWtServiceContract), binding, "net.tcp://127.0.0.1:6000/Icontract");
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "net.tcp://127.0.0.1:6000/Icontract/mex");
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "http://127.0.0.1/Icontract");
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости