none
WCF настройка сервера

    Вопрос

  • Есть сервер с настройкой:

    ServiceHost host = new ServiceHost(typeof(MyService));
    NetTcpBinding binding = new NetTcpBinding();
    binding.PortSharingEnabled = true;
    host.AddServiceEndpoint(typeof(IContract), binding, "net.tcp://localhost");
    host.Open();

    Есть клиент с подключением:

    NetTcpBinding binding = new NetTcpBinding();
    IContract channel = ChannelFactory<IContract>.CreateChannel(binding, new EndpointAddress("net.tcp://192.168.0.10"));
    channel.Metod();

    При работе клиента и сервера на одном ПК всё работает, а по локальной сети клиент не видит сервер. Выдает ошибка TCP 10060.

    Какие настройки нужно поменять и где, чтобы ПК с "сервером" был виден "клиенту" на другой машине?

    Где можно чего почитать на эту тему?


    • Изменено Liliya Muray 9 октября 2018 г. 9:26
    9 октября 2018 г. 9:26

Ответы

Все ответы

  • Попробуйте вместо localhost задавать 0.0.0.0 или *. 
    9 октября 2018 г. 10:18
  • Попробуйте вместо localhost задавать 0.0.0.0 или *. 

    "*" не поднимается сервер - ошибка, "0.0.0.0" поднимается сервер, но доступа по сети к нему не было...

    Почитала про tcp 10060... На одном из форумов про 1С советуют отрубить брандмауэр. Отрубила и теперь приложение на выключенный сервер возвращает tcp 10061, а на включенный "ошибка вызова sspi см внутреннее исключение". Я думаю нужно копать в сторону сетевой безопасности, как правильно настроить доступ моему приложению к сетевым возможностям.

    9 октября 2018 г. 11:08
  • "Почитала про tcp 10060... На одном из форумов про 1С советуют отрубить брандмауэр."

    10060 это ошибка WSAETIMEDOUT  в Winsock

    Connection timed out.
    A connection attempt failed because the connected party did not properly respond after a period of time, or the established connection failed because the connected host has failed to respond.

    https://docs.microsoft.com/en-us/windows/desktop/winsock/windows-sockets-error-codes-2

    Причин может быть много. Да, если с 0.0.0.0 не работает, то дело может быть в брандмауэре.

    "а на включенный "ошибка вызова sspi см внутреннее исключение"

    Покажите полный текст исключения (Exception.ToString)

    9 октября 2018 г. 11:26
  • Причин может быть много. Да, если с 0.0.0.0 не работает, то дело может быть в брандмауэре.

    "а на включенный "ошибка вызова sspi см внутреннее исключение"

    Покажите полный текст исключения (Exception.ToString)

    1. Не подскажите как подружить приложение с брандмауэр?

    2. Спасибо за "полный текст"... Да, там пишится, что нужно правильно организовать Authentication...

    System.ServiceModel.Security.SecurityNegotiationException: Ошибка вызова SSPI, см. внутреннее исключение. ---> System.Security.Authentication.AuthenticationException: Ошибка вызова SSPI, см. внутреннее исключение. ---> System.ComponentModel.Win32Exception: В пакете безопасности отсутствуют учетные данные

    9 октября 2018 г. 11:42
  • Видимо, по умолчанию NET TCP Binding использует аутентификацию Windows (NTLM или Kerberos). На локальном компе он неявно работает, а с другого компа не работает, нужно явно передавать учетные данные.

    В брендмауере вам нужно в исключения добавить ваше приложение (скорее всего, на обеих сторонах). В Windows 10, в настройках брендмауера выбрать пункт "Разрешения взаимодействия с приложением ..." и там в список добавить вашу программу.

    9 октября 2018 г. 11:54
  • Видимо, по умолчанию NET TCP Binding использует аутентификацию Windows (NTLM или Kerberos). На локальном компе он неявно работает, а с другого компа не работает, нужно явно передавать учетные данные.

    В брендмауере вам нужно в исключения добавить ваше приложение (скорее всего, на обеих сторонах). В Windows 10, в настройках брендмауера выбрать пункт "Разрешения взаимодействия с приложением ..." и там в список добавить вашу программу.

    С безопасностью позже по разбираюсь, пока без нее можно))) отрубила проверку на сервере и клиенте

    binding.Security.Mode = SecurityMode.None;
    А как программно добавить приложение в список исключений?


    9 октября 2018 г. 12:08
  • Нашла пример по добавлению правила:

    INetFwMgr firewallMgr = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwMgr", false));
    INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
    firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK; // Действие правила
    firewallRule.ApplicationName = @"C:\Program.exe"; // Путь программы
    firewallRule.Enabled = true; // Включить
    firewallRule.InterfaceTypes = "All"; // Профили
    firewallRule.Name = "Program"; // Название
    INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    firewallPolicy.Rules.Add(firewallRule);

    Пока не пробовала использовать. Хотелось бы с начала почитать подробней документацию про Firewall API.

    Кто может подсказать, что почитать на эту тему?

    9 октября 2018 г. 15:09