コード例 #1
0
        /// <summary>
        /// call method sync
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connector"></param>
        /// <param name="serviceName"></param>
        /// <param name="methodName"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public static T SendDataSync <T>(this ConnectorBase connector, string serviceName, string methodName, params Shared.Models.ParameterInfo[] args)
        {
            string data = SendData(connector, serviceName, methodName, args);

            if (string.IsNullOrEmpty(data))
            {
                return(default(T));
            }
            return(ClientSerializationHelper.DeserializeObject <T>(data.ToString()));
        }
コード例 #2
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()));
        }
コード例 #3
0
        internal static async Task <T> SendData <T>(this ConnectorBase connector, MethodCallInfo callInfo)
        {
            string data = await SendDataAsync(connector, callInfo);
#endif

            if (string.IsNullOrEmpty(data))
            {
                return(default(T));
            }
            return(ClientSerializationHelper.DeserializeObject <T>(data.ToString()));
        }
コード例 #4
0
        internal static Task <T> SendDataAsync <T>(this ConnectorBase connector, MethodInfo method, MethodCallInfo callInfo, object[] args)
        {
#if (NET40 || NET35)
            return(Task <T> .Factory.StartNew(() =>
#else
            return Task.Run(async() =>
#endif
            {
                callInfo.Parameters = method.MethodToParameters(x => ClientSerializationHelper.SerializeObject(x), args).ToArray();
#if (NET40 || NET35)
                string result = SendData(connector, callInfo);
#else
                string result = await SendDataAsync(connector, callInfo);
#endif
                object deserialeResult = ClientSerializationHelper.DeserializeObject(result, typeof(T));
                return (T)deserialeResult;
            }));
        }
コード例 #5
0
        static ConnectorExtensions()
        {
            CSCodeInjection.InvokedClientMethodAction = (client, method, parameters) =>
            {
                //Console.WriteLine($"CSCodeInjection.InvokedClientMethodAction {method.Name}");
                //if (!(client is OperationCalls))
                //{
                //    AutoLogger.LogText($"cannot cast! {method.Name} params {parameters?.Length}");
                //}
                SendDataInvoke((OperationCalls)client, method.Name, parameters);
            };

            CSCodeInjection.InvokedClientMethodFunction = (client, method, parameters) =>
            {
                //Console.WriteLine($"CSCodeInjection.InvokedClientMethodFunction {method.Name}");
                object data = SendData((OperationCalls)client, method.Name, "", parameters);
                if (data == null)
                {
                    return(null);
                }
                return(data is StreamInfo ? data : ClientSerializationHelper.DeserializeObject(data.ToString(), method.ReturnType));
            };
        }
コード例 #6
0
        private static string SendData(this ConnectorBase connector, MethodCallInfo callInfo)
        {
            //TryAgain:
            bool isIgnorePriority = false;

            try
            {
                TaskCompletionSource <MethodCallbackInfo> valueData = new TaskCompletionSource <MethodCallbackInfo>();
                CancellationTokenSource ct = new CancellationTokenSource();
                ct.Token.Register(() => valueData.TrySetCanceled(), useSynchronizationContext: false);

                bool   added   = WaitedMethodsForResponse.TryAdd(callInfo.Guid, valueData);
                object service = connector.Services.ContainsKey(callInfo.ServiceName) ? connector.Services[callInfo.ServiceName] : null;
                //#if (PORTABLE)
                MethodInfo method = service?.GetType().FindMethod(callInfo.MethodName);
                //#else
                //                var method = service?.GetType().FindMethod(callInfo.MethodName, RuntimeTypeHelper.GetMethodTypes(service.GetType(), callInfo).ToArray());
                //#endif
                //
                isIgnorePriority = method?.GetCustomAttributes <PriorityCallAttribute>().Count() > 0;

                connector.SendData(callInfo);


                MethodCallbackInfo result = valueData.Task.Result;

                if (result == null)
                {
                    if (connector.IsDisposed)
                    {
                        throw new ObjectDisposedException("Provider");
                    }
                    if (!connector.IsConnected)
                    {
                        throw new Exception("client disconnected");
                    }
                    return(null);
                }
                if (result.IsException)
                {
                    throw new Exception("server exception:" + ClientSerializationHelper.DeserializeObject <string>(result.Data));
                }
                else if (result.IsAccessDenied && result.Data == null)
                {
                    throw new Exception("server permission denied exception.");
                }

                return(result.Data);
            }
            catch (Exception ex)
            {
                if (connector.IsConnected && !connector.SendPingAndWaitToReceive())
                {
                    connector.Disconnect();
                }
                throw ex;
            }
            finally
            {
                WaitedMethodsForResponse.Remove(callInfo.Guid);
            }
        }