コード例 #1
0
        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]);
        }
コード例 #2
0
 public CachedResolveResponse(string serviceName, ResolveResponse resolveResponse)
 {
     this.ServiceName = serviceName;
     this.Cached      = DateTime.Now;
     this.Endpoints   = resolveResponse.Endpoints;
     this.Properties  = resolveResponse.Properties;
 }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: teco-kit/dpwsGW
        /// <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());
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        /// <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());
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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;
                }
            }
        }
コード例 #10
0
        /// <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;
            }
        }