コード例 #1
0
        /// <summary>
        /// send data to server
        /// </summary>
        /// <param name="client">client is sended</param>
        /// <param name="callerName">methos name</param>
        /// <param name="attibName">service name</param>
        /// <param name="args">method parameters</param>
        /// <returns></returns>
        internal static object SendData(this OperationCalls client, string callerName, string attibName, params object[] args)
        {
            MethodCallInfo callInfo = new MethodCallInfo();

            if (string.IsNullOrEmpty(attibName))
            {
                callInfo.ServiceName = client.GetType().GetCustomAttributes <ServiceContractAttribute>(true).FirstOrDefault().Name;
            }
            else
            {
                callInfo.ServiceName = attibName;
            }

            callInfo.MethodName = callerName;
            foreach (var item in args)
            {
                callInfo.Parameters.Add(new Shared.Models.ParameterInfo()
                {
                    Value = JsonConvert.SerializeObject(item), Type = item?.GetType().FullName
                });
            }
            var guid = Guid.NewGuid().ToString();

            callInfo.Guid = guid;
            return(SendData(client.Connector, callInfo, args.Length == 1 && args[0] != null && args[0].GetType() == typeof(StreamInfo) ? (StreamInfo)args[0] : null));
        }
コード例 #2
0
        //public static void RunOnDispatcher(this ClientInfo client, Action run)
        //{
        //    client.ServerBase.ClientDispatchers[client].Post((state) =>
        //    {
        //        run();
        //    }, null);
        //}

        public static T SendData <T>(this OperationCalls client, string callerName, params object[] args)
        {
            var data = SendData(client, callerName, args);

            if (data == null || data.ToString() == "")
            {
                return(default(T));
            }
            return(ServerSerializationHelper.Deserialize <T>(data.ToString(), client.ServerBase));
        }
コード例 #3
0
        public static T CallClientCallbackMethod <T>(this OperationCalls client, string methodName, params object[] values)
        {
            var data = CallClientCallbackMethod(client, methodName, values);

            if (data == null || data.ToString() == "")
            {
                return(default(T));
            }
            return(ServerSerializationHelper.Deserialize <T>(data.ToString(), client.ServerBase));
        }
コード例 #4
0
        /// <summary>
        /// send data to client
        /// </summary>
        /// <typeparam name="T">return type data</typeparam>
        /// <param name="client">client for send data</param>
        /// <param name="callerName">method name</param>
        /// <param name="args">argumants of method</param>
        /// <returns></returns>
        internal static T SendData <T>(this OperationCalls client, string callerName, params object[] args)
        {
            var data = SendData(client, callerName, "", args);

            if (data == null || data.ToString() == "")
            {
                return(default(T));
            }
            return(JsonConvert.DeserializeObject <T>(data.ToString()));
        }
コード例 #5
0
        /// <summary>
        /// send data to client
        /// </summary>
        /// <typeparam name="T">return type data</typeparam>
        /// <param name="client">client for send data</param>
        /// <param name="serviceName">method name</param>
        /// <param name="args">argumants of method</param>
        /// <returns></returns>
        internal static T SendData <T>(this OperationCalls client, string serviceName, params Shared.Models.ParameterInfo[] args)
        {
            object data = SendData(client, serviceName, "", args);

            if (data == null || data.ToString() == "")
            {
                return(default(T));
            }
            return(ClientSerializationHelper.DeserializeObject <T>(data.ToString()));
        }
コード例 #6
0
        /// <summary>
        /// send data to server
        /// </summary>
        /// <param name="client">client is sended</param>
        /// <param name="serviceName">methos name</param>
        /// <param name="attibName">service name</param>
        /// <param name="args">method parameters</param>
        /// <returns></returns>
        internal static object SendData(this OperationCalls client, string serviceName, string attibName, params Shared.Models.ParameterInfo[] args)
        {
            if (string.IsNullOrEmpty(attibName))
            {
                serviceName = client.GetType().GetServerServiceName(false);
            }
            else
            {
                serviceName = attibName;
            }
#if (NET40 || NET35)
            return(SendData(client.Connector, serviceName, serviceName, args));
#else
            return(SendDataAsync(client.Connector, serviceName, serviceName, args));
#endif
        }
コード例 #7
0
        static object SendData(this OperationCalls client, string callerName, params object[] args)
        {
            var attribute = client.GetType().GetCustomAttributes <ServiceContractAttribute>(true).FirstOrDefault();

            if (client.ServerBase.ClientRegistredMethods[client.CurrentClient].ContainsKey(attribute.Name))
            {
                if (client.ServerBase.ClientRegistredMethods[client.CurrentClient][attribute.Name].Contains(callerName))
                {
                    return(SendDataNow(client, callerName, args));
                }
            }
            else if (client.ServerBase.RegisteredCallbacksTypes.ContainsKey(attribute.Name))
            {
                return(SendDataNow(client, callerName, args));
            }
            return(null);
        }
コード例 #8
0
        static object SendDataNow(this OperationCalls client, string callerName, params object[] args)
        {
            if (SynchronizationContext.Current != null && ServerBase.AllDispatchers.ContainsKey(SynchronizationContext.Current) && ServerBase.AllDispatchers[SynchronizationContext.Current].MainContext == SynchronizationContext.Current)
            {
                throw new Exception("Cannot call method from class Constractor or main Thread");
            }
            var            attribute = client.GetType().GetCustomAttributes <ServiceContractAttribute>(true).FirstOrDefault();
            MethodCallInfo callInfo  = new MethodCallInfo();

            callInfo.ServiceName = attribute.Name;
            callInfo.MethodName  = callerName;
            foreach (var item in args)
            {
                callInfo.Parameters.Add(new Shared.Models.ParameterInfo()
                {
                    Value = item == null ? null : ServerSerializationHelper.SerializeObject(item, client.ServerBase), Type = item == null ? null : item.GetType().FullName
                });
            }
            var guid = Guid.NewGuid().ToString();

            callInfo.Guid = guid;
            var waitedMethodsForResponse = client.ServerBase.WaitedMethodsForResponse[client.CurrentClient];

            waitedMethodsForResponse.TryAdd(guid, new KeyValue <AutoResetEvent, MethodCallbackInfo>(new AutoResetEvent(false), null));
            client.ServerBase.CallClientMethod(client.CurrentClient, callInfo);
            var seted = waitedMethodsForResponse[guid].Key.WaitOne(client.ServerBase.ProviderSetting.SendDataTimeout);

            if (!seted)
            {
                client.ServerBase.CheckClient(client.CurrentClient);
                waitedMethodsForResponse.Remove(guid);
                throw new TimeoutException();
            }
            if (waitedMethodsForResponse[guid].Value.IsException)
            {
                var data = waitedMethodsForResponse[guid].Value.Data;
                waitedMethodsForResponse.Remove(guid);
                throw new Exception("method call exception: " + data);
            }
            var result = waitedMethodsForResponse[guid].Value.Data;

            waitedMethodsForResponse.Remove(guid);
            return(result);
        }
コード例 #9
0
        public static object CallClientCallbackMethod(this OperationCalls client, string methodName, params object[] values)
        {
            if (SynchronizationContext.Current != null && ServerBase.AllDispatchers.ContainsKey(SynchronizationContext.Current))
            {
                throw new Exception("Cannot call method from class Constractor or main Thread");
            }
            MethodCallInfo callInfo = new MethodCallInfo();

#if (NETSTANDARD1_6 || NETCOREAPP1_1)
            callInfo.ServiceName = ((ServiceContractAttribute)client.GetType().GetTypeInfo().GetCustomAttributes(typeof(ServiceContractAttribute), true).FirstOrDefault()).Name;
#else
            callInfo.ServiceName = ((ServiceContractAttribute)client.GetType().GetCustomAttributes(typeof(ServiceContractAttribute), true).FirstOrDefault()).Name;
#endif
            callInfo.MethodName = methodName;
            foreach (var item in values)
            {
                callInfo.Parameters.Add(new Shared.Models.ParameterInfo()
                {
                    Value = ServerSerializationHelper.SerializeObject(item, client.ServerBase), Type = item.GetType().FullName
                });
            }
            var guid = Guid.NewGuid().ToString();
            callInfo.Guid = guid;
            var waitedMethodsForResponse = client.ServerBase.WaitedMethodsForResponse[client.CurrentClient];
            waitedMethodsForResponse.TryAdd(guid, new KeyValue <AutoResetEvent, MethodCallbackInfo>(new AutoResetEvent(false), null));
            client.ServerBase.CallClientMethod(client.CurrentClient, callInfo);
            var seted = waitedMethodsForResponse[guid].Key.WaitOne(client.ServerBase.ProviderSetting.ReceiveDataTimeout);
            if (!seted)
            {
                client.ServerBase.CheckClient(client.CurrentClient);
                waitedMethodsForResponse.Remove(guid);
                throw new TimeoutException();
            }
            if (waitedMethodsForResponse[guid].Value.IsException)
            {
                var data = waitedMethodsForResponse[guid].Value.Data;
                waitedMethodsForResponse.Remove(guid);
                throw new Exception("call method return exception: " + data);
            }
            var result = waitedMethodsForResponse[guid].Value.Data;
            waitedMethodsForResponse.Remove(guid);
            return(result);
        }
コード例 #10
0
 public static void SendDataInvoke(this OperationCalls client, string callerName, params object[] args)
 {
     SendData(client, callerName, args);
 }
コード例 #11
0
 /// <summary>
 /// send data not use params by array object
 /// </summary>
 /// <param name="client"></param>
 /// <param name="callerName"></param>
 /// <param name="attibName"></param>
 /// <param name="args"></param>
 /// <returns></returns>
 internal static object SendDataNoParam(this OperationCalls client, string callerName, string attibName, object[] args)
 {
     return(SendData(client, callerName, attibName, args));
 }
コード例 #12
0
 /// <summary>
 /// send data not use params by array object
 /// </summary>
 /// <param name="client"></param>
 /// <param name="serviceName"></param>
 /// <param name="attibName"></param>
 /// <param name="args"></param>
 /// <returns></returns>
 internal static object SendDataNoParam(this OperationCalls client, string serviceName, string attibName, Shared.Models.ParameterInfo[] args)
 {
     return(SendData(client, serviceName, attibName, args));
 }
コード例 #13
0
 /// <summary>
 /// send data none return value
 /// </summary>
 /// <param name="client"></param>
 /// <param name="serviceName"></param>
 /// <param name="args"></param>
 internal static void SendDataInvoke(this OperationCalls client, string serviceName, params Shared.Models.ParameterInfo[] args)
 {
     SendData(client, serviceName, "", args);
 }