private static Endpoint GetFreeEndpoint(string serviceName) { int counter = 0; lock (invocationCounter) { if (!invocationCounter.ContainsKey(serviceName)) { invocationCounter.Add(serviceName, 0); } counter = invocationCounter[serviceName]; if (counter == int.MaxValue) { counter = 0; } invocationCounter[serviceName] = ++counter; } logger.Debug("counter: " + counter); ResolveResponse resolveResponse = resolver.Resolve(serviceName);// Resolve(serviceName); int endpointIndex = counter % resolveResponse.Endpoints.Count; logger.Debug("endpointIndex: " + endpointIndex); return(resolveResponse.Endpoints[endpointIndex]); }
public CachedResolveResponse(string serviceName, ResolveResponse resolveResponse) { this.ServiceName = serviceName; this.Cached = DateTime.Now; this.Endpoints = resolveResponse.Endpoints; this.Properties = resolveResponse.Properties; }
/// <summary> /// Invoke a synchronous service with the specified payload. The method call block until the method return. /// </summary> /// <typeparam name="TI">The payload type.</typeparam> /// <typeparam name="TO">The return type.</typeparam> /// <param name="serviceName">The name of the service, as configured in Argilla.Node.ServiceName.</param> /// <param name="payload">The payload used for invoke the service.</param> /// <returns></returns> public static TO Invoke <TI, TO>(string serviceName, TI payload) { TO outputValue = default; PayloadSync payloadSync = new PayloadSync() { Payload = payload }; string json = CustomJsonSerializer.Serialize(payloadSync); Exception lastException = null; try { Endpoint endpoint = GetFreeEndpoint(serviceName); string jsonResult = HttpHelper.Post(endpoint.EndpointSync, json); outputValue = CustomJsonSerializer.Deserialize <TO>(jsonResult); lastException = null; } catch (Exception ex) { logger.Error(ex.Message); ResolveResponse resolveResponse = Resolve(serviceName); foreach (Endpoint endpoint in resolveResponse.Endpoints) { try { string jsonResult = HttpHelper.Post(endpoint.EndpointSync, json); outputValue = CustomJsonSerializer.Deserialize <TO>(jsonResult); lastException = null; break; } catch (Exception e) { lastException = e; } } } if (lastException != null) { logger.Error(lastException, lastException.Message); throw lastException; } logger.Debug(String.Format("Output value: {0}", outputValue)); return(outputValue); }
/// <summary> /// Try to find the physical address of a service using discovery functions. /// Uses the http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe message and /// http://schemas.xmlsoap.org/ws/2005/04/discovery/Resolve message. /// </summary> /// <returns>The endpoint of the service, null otherwise.</return> public static EndpointAddress[] FindServiceAddress() { Dictionary <Uri, EndpointAddress> ret = new Dictionary <Uri, EndpointAddress>(); // Creating DiscoveryClient class. DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005)); ; Console.Write("Finding for all services in the network (empty criteria)..."); FindResponse findResponseX = discoveryClient.Find(new FindCriteria() { Duration = new TimeSpan(0, 0, 2) }); Console.WriteLine("{0} found.\n", findResponseX.Endpoints.Count); // Search for each endpoint found to resolve the address given. if (findResponseX.Endpoints.Count > 0) { foreach (EndpointDiscoveryMetadata meta in findResponseX.Endpoints) { if (ret.ContainsKey(meta.Address.Uri)) { continue; } // Get all contracts of the endpoints. foreach (System.Xml.XmlQualifiedName type in meta.ContractTypeNames) { // Check if its a valid contract. foreach (System.Xml.XmlQualifiedName name in deviceTypes.Keys) { if (type.Equals(name)) { ResolveResponse resolveResponse = discoveryClient.Resolve(new ResolveCriteria(meta.Address)); Console.WriteLine("New device found: {0}:{1} at {2}", name.Namespace, name.Name, resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]); edu.teco.DPWS.Device device = (edu.teco.DPWS.Device)Activator.CreateInstance(deviceTypes[name]); device.EndpointAddress = new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]); GetMetaData(device); device.Init(); knownDevices.Add(device); ret.Add(meta.Address.Uri, new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0])); Console.WriteLine("Service can now be invoked"); break; } } } } } return(ret.Values.ToArray()); }
public ActionResult Resolve([FromBody] ResolveRequest resolveRequest) { securityManager.Verify(new SecurityAssertion() { Payload = resolveRequest }); logger.Info("Resolve: " + CustomJsonSerializer.Serialize(resolveRequest)); ResolveResponse resolveResponse = new ResolveResponse(); resolveResponse.Endpoints = storageManager.Resolve(resolveRequest); return(new JsonResult(resolveResponse)); }
/// <summary> /// Try to find the physical address of a service using discovery functions. /// Uses the http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe message and /// http://schemas.xmlsoap.org/ws/2005/04/discovery/Resolve message. /// </summary> /// <returns>The endpoint of the service, null otherwise.</return> public static EndpointAddress[] FindServiceAddress() { Dictionary <Uri, EndpointAddress> ret = new Dictionary <Uri, EndpointAddress>(); // Creating DiscoveryClient class. DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005)); ; Console.Write("Finding for all services in the network (empty criteria)..."); FindResponse findResponseX = discoveryClient.Find(new FindCriteria() { Duration = new TimeSpan(0, 0, 2) }); Console.WriteLine("{0} found.\n", findResponseX.Endpoints.Count); // Search for each endpoint found to resolve the address given. if (findResponseX.Endpoints.Count > 0) { foreach (EndpointDiscoveryMetadata meta in findResponseX.Endpoints) { if (ret.ContainsKey(meta.Address.Uri)) { continue; } // Get all contracts of the endpoints. foreach (System.Xml.XmlQualifiedName type in meta.ContractTypeNames) { // Check if its a valid contract. //Console.WriteLine("Checking {0}@{1}", type, meta.Address); if (type.Equals(new System.Xml.XmlQualifiedName("SSimpDeviceType", "http://www.teco.edu/SensorValues"))) { // Call the resolve function. //Console.WriteLine("Found {0}@{1}",type,meta.Address); ResolveResponse resolveResponse = discoveryClient.Resolve(new ResolveCriteria(meta.Address)); //Console.WriteLine("Resolved {0} to {1}", resolveResponse.EndpointDiscoveryMetadata.Address, resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]); ret.Add(meta.Address.Uri, new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0])); } } } } return(ret.Values.ToArray()); }
public static bool CanResolve(string serviceName) { try { ResolveResponse resolveResponse = Resolve(serviceName); if (resolveResponse != null && resolveResponse.Endpoints != null && resolveResponse.Endpoints.Count > 0) { return(true); } return(false); } catch { return(false); } }
static EndpointAddress FindServiceAddress() { // Create DiscoveryClient DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005)); //new DiscoveryClient(new UdpDiscoveryEndpoint());# // discoveryClient.Endpoint.Binding.ReceiveTimeout = new TimeSpan(0,0,1); Console.WriteLine("Finding endpoints via UDP Discovery"); // Find ICalculatorService endpoints FindResponse findResponseX = discoveryClient.Find(new FindCriteria()); Console.WriteLine("Found {0} ServiceHost endpoint(s).", findResponseX.Endpoints.Count); Console.WriteLine(); if (findResponseX.Endpoints.Count > 0) { foreach (EndpointDiscoveryMetadata meta in findResponseX.Endpoints) { foreach (System.Xml.XmlQualifiedName type in meta.ContractTypeNames) { Console.WriteLine("Checking {0}@{1}", type, meta.Address); if (type.Equals(new System.Xml.XmlQualifiedName("SSimpDeviceType", "http://www.teco.edu/SensorValues"))) { Console.WriteLine("Found {0}@{1}", type, meta.Address); ResolveResponse resolveResponse = discoveryClient.Resolve(new ResolveCriteria(meta.Address)); Console.WriteLine("Resolved {0} to {1}", resolveResponse.EndpointDiscoveryMetadata.Address, resolveResponse.EndpointDiscoveryMetadata.ListenUris[0]); return(new EndpointAddress(resolveResponse.EndpointDiscoveryMetadata.ListenUris[0])); } } } return(null); } else { return(null); } }
private static ResolveResponse Resolve(string serviceName) { CachedResolveResponse cachedResolveResponse = resolveResponses.Where(x => x.ServiceName == serviceName).FirstOrDefault(); if (cachedResolveResponse != null) { int cacheLifetime = ArgillaSettings.Current.Resolver.CacheLifetime == 0 ? DEFAULT_RESOLVER_CACHE_LIFETIME : ArgillaSettings.Current.Resolver.CacheLifetime; if (DateTime.Now.Subtract(cachedResolveResponse.Cached).TotalMilliseconds > 1000 * cacheLifetime) { if (resolveResponses.Contains(cachedResolveResponse)) { lock (LOCK) { if (resolveResponses.Contains(cachedResolveResponse)) { logger.Debug(String.Format("Resolve response purged from cache for service {0}", serviceName)); resolveResponses.Remove(cachedResolveResponse); } } } } else { logger.Debug(String.Format("Resolve response found in cache for service {0}", serviceName)); return(cachedResolveResponse as ResolveResponse); } } try { ResolveResponse resolveResponse = resolver.Resolve(serviceName); if (resolveResponse == null || resolveResponse.Endpoints == null || resolveResponse.Endpoints.Count < 1) { Manage(new ServiceNotResolvedException(String.Format("Cannot resolve service {0}", serviceName))); } if (!resolveResponses.Contains(cachedResolveResponse)) { lock (LOCK) { if (!resolveResponses.Contains(cachedResolveResponse)) { logger.Debug(string.Format("Resolve response added to cache for service {0}", serviceName)); resolveResponses.Add(new CachedResolveResponse(serviceName, resolveResponse)); } } } return(resolveResponse); } catch (Exception e) { if (e.InnerException != null) { Manage(new ResolveException(serviceName)); return(new ResolveResponse()); } else { throw; } } }
/// <summary> /// Invoke an asynchronous service with the specified payload. The method call return immediately. When the service return the response this will be used as argumento of the callback. /// </summary> /// <typeparam name="T">the payload type.</typeparam> /// <param name="serviceName">The name of the service.</param> /// <param name="payload">The payload used for invoke the service.</param> /// <param name="action">The callback invoked when the response arrive from the service.</param> public static void Invoke <T>(string serviceName, T payload, Action <Object> action) { if (!Host.IsStarted) { throw new HostNotStartedException(); } if (ArgillaSettings.Current.Node == null) { throw new NodeNotConfiguredException(); } string correlationId = Guid.NewGuid().ToString(); pending.Add(correlationId, new PendingRequest() { Action = action }); logger.Debug(String.Format("Correlation ID: {0}", correlationId)); PayloadAsync payloadAsync = new PayloadAsync() { CorrelationId = correlationId.ToString(), Payload = payload, UrlCallback = ArgillaSettings.Current.Node.Return }; string json = CustomJsonSerializer.Serialize(payloadAsync); Exception lastException = null; try { Endpoint endpoint = GetFreeEndpoint(serviceName); string jsonResult = HttpHelper.Post(endpoint.EndpointAsync, json); lastException = null; } catch { ResolveResponse resolveResponse = Resolve(serviceName); foreach (Endpoint endpoint in resolveResponse.Endpoints) { try { string jsonResult = HttpHelper.Post(endpoint.EndpointAsync, json); logger.Debug(String.Format("Json result: {0}", jsonResult)); lastException = null; break; } catch (Exception e) { lastException = e; } } } if (lastException != null) { logger.Error(lastException, lastException.Message); throw lastException; } }