Beispiel #1
0
 public ServiceAddress PrimaryAddress(ServiceType type)
 {
     return(ServiceAddresses
            .Where(a => a.Service.Value == type)
            .OrderBy(a => a.Precedence.Value)
            .FirstOrDefault());
 }
Beispiel #2
0
        public async Task LoadAsync()
        {
            long startTicks = Log.Trace(String.Format("Enter"), Common.LOG_APPNAME);

            var lookup = await _ServiceAddressLookupDataService.GetServiceAddressLookupAsync();

            ServiceAddresses.Clear();

            foreach (var item in lookup)
            {
                ServiceAddresses.Add(item);
            }

            Log.Trace(String.Format("Exit"), Common.LOG_APPNAME, startTicks);
        }
        private static void WriteValue(object value, BinaryWriter writer)
        {
            Type valueType     = value == null ? typeof(DBNull) : value.GetType();
            byte valueTypeCode = GetCode(valueType);

            writer.Write(valueTypeCode);

            if (value == null)
            {
            }
            else if (valueType == typeof(byte))
            {
                writer.Write((byte)value);
            }
            else if (valueType == typeof(short))
            {
                writer.Write((short)value);
            }
            else if (valueType == typeof(int))
            {
                writer.Write((int)value);
            }
            else if (valueType == typeof(long))
            {
                writer.Write((long)value);
            }
            else if (valueType == typeof(float))
            {
                writer.Write((float)value);
            }
            else if (valueType == typeof(double))
            {
                writer.Write((double)value);
            }
            else if (valueType == typeof(bool))
            {
                writer.Write((bool)value);
            }
            else if (valueType == typeof(DateTime))
            {
                value = ((DateTime)value).ToBinary();
                writer.Write((long)value);
            }
            else if (valueType == typeof(TimeSpan))
            {
                value = ((TimeSpan)value).Ticks;
                writer.Write((long)value);
            }
            else if (valueType == typeof(string))
            {
                string s  = (string)value;
                int    sz = s.Length;
                writer.Write(sz);

                for (int i = 0; i < sz; i++)
                {
                    writer.Write(s[i]);
                }
                // Extensions ...
            }
            else if (typeof(IServiceAddress).IsAssignableFrom(valueType))
            {
                IServiceAddress        address = (IServiceAddress)value;
                IServiceAddressHandler handler = ServiceAddresses.GetHandler(address);
                byte[] buffer = handler.ToBytes(address);
                int    code   = handler.GetCode(address.GetType());
                writer.Write(code);
                writer.Write(buffer.Length);
                writer.Write(buffer);
            }
            else if (valueType == typeof(DataAddress))
            {
                DataAddress dataAddr = (DataAddress)value;
                writer.Write(dataAddr.DataId);
                writer.Write(dataAddr.BlockId.High);
                writer.Write(dataAddr.BlockId.Low);
            }
            else if (valueType == typeof(MessageError))
            {
                MessageError e = (MessageError)value;
                writer.Write(e.Source);
                writer.Write(e.Message);
                writer.Write(e.StackTrace);
            }
            else if (typeof(NodeSet).IsAssignableFrom(valueType))
            {
                if (value is SingleNodeSet)
                {
                    writer.Write((byte)1);
                }
                else if (value is CompressedNodeSet)
                {
                    writer.Write((byte)2);
                }
                else
                {
                    throw new Exception("Unknown NodeSet type: " + value.GetType());
                }
                NodeSet nset = (NodeSet)value;
                // Write the node set,
                NodeId[] nodeIds = nset.NodeIds;
                int      nsz     = nodeIds.Length;
                writer.Write(nsz);
                for (int i = 0; i < nsz; i++)
                {
                    NodeId nodeId = nodeIds[i];
                    writer.Write(nodeId.High);
                    writer.Write(nodeId.Low);
                }
                // Write the binary encoding,
                byte[] buffer = nset.Buffer;
                int    bsz    = buffer.Length;
                writer.Write(bsz);
                writer.Write(buffer, 0, bsz);
            }
            else if (value is Array)
            {
                Array array         = (Array)value;
                Type  arrayType     = array.GetType().GetElementType();
                byte  arrayTypeCode = GetCode(arrayType);

                int sz = array.Length;
                writer.Write(arrayTypeCode);
                writer.Write(sz);

                for (int i = 0; i < sz; i++)
                {
                    object item = array.GetValue(i);
                    WriteValue(item, writer);
                }
            }
        }
        private static object ReadValue(BinaryReader reader, byte typeCode)
        {
            Type type = GetType(typeCode);

            if (type == typeof(DBNull))
            {
                return(null);
            }
            if (type == typeof(bool))
            {
                return(reader.ReadBoolean());
            }
            if (type == typeof(byte))
            {
                return(reader.ReadByte());
            }
            if (type == typeof(short))
            {
                return(reader.ReadInt16());
            }
            if (type == typeof(int))
            {
                return(reader.ReadInt32());
            }
            if (type == typeof(long))
            {
                return(reader.ReadInt64());
            }
            if (type == typeof(float))
            {
                return(reader.ReadSingle());
            }
            if (type == typeof(double))
            {
                return(reader.ReadDouble());
            }
            if (type == typeof(DateTime))
            {
                return(DateTime.FromBinary(reader.ReadInt64()));
            }

            if (type == typeof(char))
            {
                return(reader.ReadChar());
            }

            if (type == typeof(string))
            {
                int           sz = reader.ReadInt32();
                StringBuilder sb = new StringBuilder(sz);
                for (int i = 0; i < sz; i++)
                {
                    sb.Append(reader.ReadChar());
                }
                return(sb.ToString());
            }

            // Extensions ...

            if (type == typeof(IServiceAddress))
            {
                int  addressTypeCode           = reader.ReadInt32();
                Type addressType               = ServiceAddresses.GetAddressType(addressTypeCode);
                IServiceAddressHandler handler = ServiceAddresses.GetHandler(addressType);
                int    length = reader.ReadInt32();
                byte[] buffer = reader.ReadBytes(length);
                return(handler.FromBytes(buffer));
            }

            if (type == typeof(DataAddress))
            {
                int  dataId      = reader.ReadInt32();
                long blockIdHigh = reader.ReadInt64();
                long blockIdLow  = reader.ReadInt64();
                return(new DataAddress(new BlockId(blockIdHigh, blockIdLow), dataId));
            }

            if (type == typeof(MessageError))
            {
                string source     = reader.ReadString();
                string message    = reader.ReadString();
                string stackTrace = reader.ReadString();
                string errorType  = reader.ReadString();
                return(new MessageError(source, message, stackTrace, errorType));
            }

            if (type == typeof(NodeSet))
            {
                byte nodeSetType = reader.ReadByte();
                // The node_ids list,
                int      sz  = reader.ReadInt32();
                NodeId[] arr = new NodeId[sz];
                for (int n = 0; n < sz; ++n)
                {
                    long nrHigh = reader.ReadInt64();
                    long nrLow  = reader.ReadInt64();
                    arr[n] = new NodeId(nrHigh, nrLow);
                }
                // The binary encoding,
                sz = reader.ReadInt32();
                byte[] buf = new byte[sz];
                // Util.BinaryReader.ReadFully(din, buf, 0, sz);
                reader.Read(buf, 0, sz);
                // Make the node_set object type,
                if (nodeSetType == 1)
                {
                    // Uncompressed single,
                    return(new SingleNodeSet(arr, buf));
                }
                if (nodeSetType == 2)
                {
                    // Compressed group,
                    return(new CompressedNodeSet(arr, buf));
                }

                throw new Exception("Unknown node set type: " + nodeSetType);
            }

            // array
            if (type == typeof(Array))
            {
                byte  arrayTypeCode = reader.ReadByte();
                int   sz            = reader.ReadInt32();
                Type  arrayType     = GetType(arrayTypeCode);
                Array array         = Array.CreateInstance(arrayType, sz);
                for (int i = 0; i < sz; i++)
                {
                    object value = ReadValue(reader);
                    array.SetValue(value, i);
                }

                return(array);
            }

            throw new FormatException();
        }
Beispiel #5
0
        public static ServiceAddress ResolveServer(ILogger logger, string serviceName, ServiceAddresses serviceAddrs, string[] requiredContracts)
        {
            var serverList = new List <RoundTripData>();

            foreach (ServiceAddress serviceAddr in serviceAddrs.List)
            {
                Int64 roundTrip; // ticks
                int   maxRoundTrips = 1;
                if (serviceAddrs.List.Count > 1)
                {
                    maxRoundTrips = 3;
                }
                if (QueryService(logger, serviceAddr.Host, serviceAddr.Port, serviceName, requiredContracts, maxRoundTrips, out roundTrip))
                {
                    // add addr to list
                    serverList.Add(new RoundTripData(serviceAddr, roundTrip));
                }
            } // foreach server address
            // find 'nearest' server
            if (serverList.Count > 0)
            {
                ServiceAddress address       = serverList[0].Addr;
                Int64          bestRoundTrip = serverList[0].Ticks;
                foreach (RoundTripData item in serverList)
                {
                    if (item.Ticks < bestRoundTrip)
                    {
                        address       = item.Addr;
                        bestRoundTrip = item.Ticks;
                    }
                }
                return(address);
            }
            throw new EndpointNotFoundException(
                      $"No server in list '{serviceAddrs}' found!");
        }