예제 #1
0
        private void CheckTransport()
        {
            var transportState = _transport.State;

            if (transportState == TcpTransportState.Closed)
            {
                throw new RpcException("SimpleRpcClient CheckTransport failed,connection has been closed");
            }

            if (transportState == TcpTransportState.Uninit)
            {
                try
                {
                    _transport.Init();
                }
                catch (Exception ex)
                {
                    try
                    {
                        _transport.Close();
                    }
                    catch
                    {
                    }

                    LogAgent.Warn("close network in SimpleRpcClient CheckTransport,transport init error", ex);
                    throw;
                }
            }
        }
예제 #2
0
        private void RegisterServices(List <Tuple <Type, RpcServiceAttribute> > serviceTypeList, IRpcSerializer rpcSerializer)
        {
            foreach (var tuple in serviceTypeList)
            {
                var serviceType      = tuple.Item1;
                var serviceAttribute = tuple.Item2;

                try
                {
                    var service = ObjectFactory.CreateInstance(serviceType);

                    var serviceName = serviceAttribute.ServiceName;
                    if (string.IsNullOrEmpty(serviceName))
                    {
                        serviceName = serviceType.Name;
                    }

                    var methodInfoArray = serviceType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                    foreach (var methodInfo in methodInfoArray)
                    {
                        var actionAttribute = (RpcServiceActionAttribute)methodInfo.GetCustomAttributes(typeof(RpcServiceActionAttribute), false).FirstOrDefault();
                        var actionName      = actionAttribute?.ActionName;
                        if (string.IsNullOrEmpty(actionName))
                        {
                            actionName = methodInfo.Name;
                        }

                        RegisterService(serviceName, actionName, service, serviceType, methodInfo, rpcSerializer);
                    }
                }
                catch (Exception ex)
                {
                    LogAgent.Warn(string.Format("RegisterService failed,type:{0}", serviceType.Name), ex);
                }
            }
        }
예제 #3
0
        private void AcceptSocketCallback(IAsyncResult ar)
        {
            if (_serverState != 2)
            {
                return;
            }

            var server = (Socket)ar.AsyncState;

            Socket     client     = null;
            IPEndPoint ipEndPoint = null;

            try
            {
                client     = server.EndAccept(ar);
                ipEndPoint = (IPEndPoint)client.RemoteEndPoint;
            }
            catch (Exception ex)
            {
                LogAgent.Warn("RpcServer AcceptSocketCallback failed,EndAccept error", ex);
            }

            try
            {
                server.BeginAccept(AcceptSocketCallback, server);
            }
            catch (Exception ex)
            {
                Close();
                try
                {
                    if (client != null)
                    {
                        client.Close();
                    }
                }
                catch
                {
                }

                LogAgent.Warn("close network in RpcServer AcceptSocketCallback,BeginAccept error", ex);
                return;
            }

            if (ipEndPoint == null)
            {
                try
                {
                    if (client != null)
                    {
                        client.Close();
                    }
                }
                catch
                {
                }

                LogAgent.Warn("close network in RpcServer AcceptSocketCallback,client RemoteEndPoint is null");
                return;
            }

            var tcpTransport = new TcpTransport(this, ipEndPoint.Address, ipEndPoint.Port);

            try
            {
                tcpTransport.Init(client);
            }
            catch (Exception ex)
            {
                try
                {
                    tcpTransport.Close();
                }
                catch
                {
                }

                LogAgent.Warn("close network in RpcServer AcceptSocketCallback,tcpTransport Init error", ex);
                return;
            }

            _clientTransportDictionary[tcpTransport.Key] = tcpTransport;
        }