WCF DiscoverClient.FindAsync создает исключение SocketException - PullRequest
0 голосов
/ 17 октября 2019

У нас есть служба WCF

var address = string.Format("net.tcp://{0}", _settings.ServerAddress);
var binding = new NetTcpBinding(SecurityMode.None) { HostNameComparisonMode = HostNameComparisonMode.Exact };

var service = new LicenseService();

_host = new ServiceHost(service);
_host.AddServiceEndpoint(typeof(ILicenseService), binding, address);
_host.AddServiceEndpoint(typeof(ILicenseServiceAdmin), binding, address);
_host.Description.Behaviors.Add(behavior);
_host.Description.Behaviors.Add(throottling);

_host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
_host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());

_host.Open();

и клиент

var searchCriteria = new FindCriteria(typeof(Utils.Licensing.ILicenseService));
_discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
_discoveryClient.FindProgressChanged += Client_FindProgressChanged;
_discoveryClient.FindCompleted += Client_FindCompleted;
_discoveryClient.FindAsync(searchCriteria, _syncObject);

. Она отлично работает для всех наших клиентов, кроме одного, который недавно сообщил о следующей ошибке:

System.Net.Sockets.SocketException (0x80004005): Ein ungültiges Аргумент wurde angegeben в System.Net.Sockets.Socket..ctor (AddressFamily addressFamily, SocketType socketType, ProtocolType protocolTypeMilePlayer для вашего сервиса) в System.Sep. .CreateListenSocket (IPAddress ipAddress, Int32 & port, Int32 receiveBufferSize, Int32 timeToLive, Int32 interfaceIndex, логическое значение allowMulticastLoopback, логическое значение isLoopbackAdapter) в System.ServiceModel.Channels.UdSendMileNelectSenseEckSense для объекта.Channels.UdpChannelFactory'1.OnCreateChannel (EndpointAddress to, Uri via) в System.ServiceModel.Channels.ChannelFactoryBase'1.InternalCreateChannel (адрес EndpointAddress, Uri через) в System.ServiceModel.ChannelFacterviceChannelFactoryOverDuplex.CreateInnerChannelBinder (EndpointAddress к, Ури через) в System.ServiceModel.Channels.ServiceChannelFactory.CreateServiceChannel (EndpointAddress адрес, Ури через) в System.ServiceModel.Channels.ServiceChannelFactory.CreateChannel (тип ChannelType, EndpointAddress адрес, Ури через) в системе. ServiceModel.DuplexChannelFactory'1.CreateChannel (InstanceContext callbackInstance, EndpointAddress address, Uri via) в System.ServiceModel.ClientBase'1.CreateChannel () в System.ServiceModel.ClientBase'1.CreateCodenel.liviceCliviceCliviceCliviceCliviceIner.)get_Channel () в System.ServiceModel.ClientBase'1.get_InnerChannel () в System.ServiceModel.Discovery.DiscoveryClient.FindAsync (критерий FindCriteria, объект userState)

Все необходимые правила добавлены в брандмауэр. Мы также пытались поиграть с правилами, но код либо находит сервис, либо нет. Это никогда не вызывает исключения.

У нас нет физического доступа к клиентскому компьютеру, и основная трудность для нас - воспроизвести эту ошибку.

Буду признателен за любую помощь.

РЕДАКТИРОВАТЬ 2019-10-22

Оказалось, что клиент запускает клиент WCF из общей папки. Не удалось установить сокет из-за настроек безопасности. Неясно, какие настройки играют здесь роль, однако после локального копирования клиента WCF проблема исчезла.

1 Ответ

1 голос
/ 18 октября 2019

Нет проблем с вашим кодом, я проверил его и обнаружил, что код клиента может правильно найти адрес службы. Это может быть проблемой конфигурации на стороне клиента. Например, согласован ли договор на обслуживание между сервером и клиентом, и параметры условия поиска?
Кроме того, ошибка, о которой сообщает клиент, не является английским языком, «указаны неверные параметры»? Можете ли вы дать мне английскую версию сообщения об ошибке? Я не сталкивался с подобной проблемой, но все дело в клиентской стороне, а не в серверной.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...