public List <string> GetIpV4Addresses(string scheme) { List <string> results = new List <string>(); // get IP address instead of hostname for addresses string hostIpv4 = null; foreach (IPAddress ipAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { hostIpv4 = ipAddress.ToString(); } } if (hostIpv4 == null) { throw new Exception("Unable to resolve host name to IPV4 address!"); } foreach (EndpointData ep in _endpoints) { if (scheme == null || ep.Scheme.ToLower() == scheme.ToLower()) { results.Add(WcfHelper.FormatAddress(ep.Scheme, hostIpv4, ep.Port, _applName, _intfName)); } } return(results); }
private static bool QueryService(ILogger logger, string host, int port, string serviceName, string[] requiredContracts, int maxRoundTrips, out Int64 bestRoundTrip) { bestRoundTrip = TimeSpan.FromSeconds(30).Ticks; AddressBinding addressBinding = WcfHelper.CreateAddressBinding( WcfConst.NetTcp, host, port, serviceName, typeof(IDiscoverV111).Name); try { using (var client = new DiscoverSenderV111(addressBinding)) { // query service n times to find best round trip int loop = 0; while (loop < maxRoundTrips) { DateTimeOffset clientTime1 = DateTimeOffset.Now; V111DiscoverReply reply = client.DiscoverServiceV111(); // fail if server does not support required contracts if (requiredContracts != null) { foreach (string requiredContract in requiredContracts) { if (reply.SupportedContracts == null) { logger.LogDebug("Server ({0}) does not support contract: '{1}'", addressBinding.Address.Uri.AbsoluteUri, requiredContract); return(false); } bool supportsContract = false; foreach (string supportedContract in reply.SupportedContracts) { if (supportedContract == requiredContract) { supportsContract = true; } } if (!supportsContract) { logger.LogDebug("Server ({0}) does not support contract: '{1}'", addressBinding.Address.Uri.AbsoluteUri, requiredContract); return(false); } } } // all required contracts supported DateTimeOffset clientTime2 = DateTimeOffset.Now; Int64 roundTrip = clientTime2.Ticks - clientTime1.Ticks; if ((roundTrip >= 0) && (roundTrip < bestRoundTrip)) { bestRoundTrip = roundTrip; } // loop loop++; } //logger.LogDebug("Server ({0}) answered ({1} ticks)", addressBinding.Address.Uri.AbsoluteUri, bestRoundTrip); return(true); } } catch (EndpointNotFoundException) { //logger.LogDebug("Server ({0}) not answering.", addressBinding.Address.Uri.AbsoluteUri); return(false); } catch (CommunicationObjectFaultedException) { //logger.LogDebug("Server ({0}) not answering.", addressBinding.Address.Uri.AbsoluteUri); return(false); } //catch (Exception excp) //{ // logger.LogError("Server ({0}) threw exception: {1}", addressBinding.Address.Uri.AbsoluteUri, excp); // return false; //} }
public AddressBinding(string uri, int limitMultiplier, TimeSpan msgLifetime) { Address = new EndpointAddress(uri); Binding = WcfHelper.CreateBinding(WcfHelper.GetSchemeFromAddress(Address), limitMultiplier, msgLifetime); }
public CustomServiceHost( ILogger logger, S serviceImpl, string endpoints, string applName, string intfName, bool multiThreaded) : base(serviceImpl) { int limitMultiplier = WcfConst.LimitMultiplier; TimeSpan msgLifetime = WcfConst.ExpressMsgLifetime; _logger = logger ?? throw new ArgumentNullException(nameof(logger)); if (endpoints == null) { throw new ArgumentNullException(nameof(endpoints)); } string[] endpointsParts = endpoints.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (endpointsParts.Length == 0) { throw new ArgumentNullException(nameof(endpoints)); } _endpoints = new EndpointData[endpointsParts.Length]; for (int i = 0; i < _endpoints.Length; i++) { _endpoints[i] = new EndpointData(endpointsParts[i]); } _applName = applName ?? throw new ArgumentNullException(nameof(applName)); _intfName = intfName ?? throw new ArgumentNullException(nameof(intfName)); // add standard behaviour ServiceBehaviorAttribute serviceBehavior = Description.Behaviors.Find <ServiceBehaviorAttribute>(); if (serviceBehavior == null) { serviceBehavior = new ServiceBehaviorAttribute(); Description.Behaviors.Add(serviceBehavior); } // exception handling serviceBehavior.IncludeExceptionDetailInFaults = true; // multi-threading singleton mode serviceBehavior.UseSynchronizationContext = false; serviceBehavior.InstanceContextMode = InstanceContextMode.Single; serviceBehavior.ConcurrencyMode = multiThreaded ? ConcurrencyMode.Multiple : ConcurrencyMode.Single; // add endpoints string httpAddress = null; foreach (var endpoint in _endpoints) { endpoint.Binding = WcfHelper.CreateBinding(endpoint.Scheme, limitMultiplier, msgLifetime); endpoint.Address = WcfHelper.FormatAddress(endpoint.Scheme, null, endpoint.Port, _applName, _intfName); // save http base address for metadata behaviour setup (below) if (endpoint.Scheme == WcfConst.Http) { httpAddress = endpoint.Address; } endpoint.Endpoint = AddServiceEndpoint(typeof(T), endpoint.Binding, endpoint.Address); if (endpoint.Scheme == WcfConst.NetMsmq) { endpoint.QueueName = WcfHelper.FormatQueueName(_applName, endpoint.Port, _intfName); } //_Logger.LogDebug("{1}: Added service endpoint: {0}", _Endpoints[i].Endpoint.Address, this.GetType().Name); } // add metadata behaviour (if HTTP endpoint exists) ServiceMetadataBehavior metadataBehavior = Description.Behaviors.Find <ServiceMetadataBehavior>(); if ((metadataBehavior == null) && (httpAddress != null)) { metadataBehavior = new ServiceMetadataBehavior { HttpGetEnabled = true, HttpGetUrl = new Uri(httpAddress) }; Description.Behaviors.Add(metadataBehavior); _logger.LogDebug("Added MEX for endpoint: {0}", httpAddress); } // ready to open Open(); if (State != CommunicationState.Opened) { throw new Exception($"ServiceHost State ({State}) <> Opened!"); } //_Logger.LogDebug("ServiceHost State: {0}", this.State); }