Не подключается локальная служба по net.tcp

282
01 июля 2017, 08:25

Пробую работать с 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();
    }
}
Answer 1

Студия использует специальный протокол для получения метаданных сервиса - 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");
READ ALSO
Автоматизация Desktop приложений (связка WinForms + jar)

Автоматизация Desktop приложений (связка WinForms + jar)

Здравствуйте! Суть проекта такая: Есть приложение WinForms, которое выступает слушателем jar приложенийТ

181
Проблемы с gulp build

Проблемы с gulp build

Добрый день Помогите разобраться с возникшей проблемойПосле оптимизации сайта с помощью gulp build , когда выгружаю его в dist , он заливается без...

253
Цвет пикселя Webgl

Цвет пикселя Webgl

При выполнении функции не всегда выдает цвет пикселя, а именно

246
Структурирование кода js

Структурирование кода js

Подскажите, как можно структурировать js-код, те

287