Информация об изменениях

Сообщение Re[8]: .Net Core, AppDomain, RPC свой велосипед от 28.02.2017 16:45

Изменено 28.02.2017 16:47 Serginio1

Re[8]: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.

S>>Ну не в одно.

AVK>Именно что в одно.


S>> Но обработку запросов кто писать будет?


AVK>Лямбды пока еще не отменили.

А лямбды кто писать будет?

По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка

 private void RunMethod(NetworkStream ns, MemoryStream ms, IPAddress adress)
        {
            using (BinaryReader br = new BinaryReader(ms))
            {
                var msRes = new MemoryStream();
                using(BinaryWriter bw= new BinaryWriter(msRes))
                { 
                    var cm = (CallMethod)br.ReadByte();
                   
                    switch (cm)
                    {
                        case CallMethod.CallFunc: CallAsFunc(br, bw); break;
                        case CallMethod.GetMember: GetPropVal(br, bw); break;
                        case CallMethod.SetMember: SetPropVal(br, bw); break;
                        case CallMethod.CallFuncAsync: CallAsyncFunc(br, bw, adress); break;
                        case CallMethod.CallDelegate: CallAsDelegate(br, bw); break;
                        case CallMethod.CallGenericFunc: CallAsGenericFunc(br, bw); break;
                        case CallMethod.GetWrapperForObjectWithEvents: GetWrapperForObjectWithEvents(br, bw, adress); break;
                        case CallMethod.GetIndex: GetIndex(br, bw); break;
                        case CallMethod.SetIndex: SetIndex(br, bw); break;
                        case CallMethod.IteratorNext: IteratorNext(br, bw); break;
                        case CallMethod.DeleteObjects: DeleteObjects(br, bw); break;

                    }

                    bw.Flush();
                    SetResult(msRes, ns);
                }

            }
        }
        private void ExecuteMethod(TcpClient client)
        {
            var adress=((IPEndPoint)client.Client.RemoteEndPoint).Address;
        //    client.Client.NoDelay = true;
            using (NetworkStream ns = client.GetStream())
            {

                // Получим данные с клиента и на основании этих данных
                //Создадим ДанныеДляКлиета1С котрый кроме данных содержит 
                //TcpClient для отправки ответа
                using (var br = new BinaryReader(ns))
                {
                    var streamSize = br.ReadInt32();

                    var res = br.ReadBytes(streamSize);

                    var ms = new MemoryStream(res);
                    ms.Position = 0;
                    RunMethod(ns, ms, adress);
                }



            }

        }




static bool  GetAW(BinaryReader br, BinaryWriter bw, out NetObjectToNative.AutoWrap  AW )
        {

            var Target = br.ReadInt32();

            AW = NetObjectToNative.AutoWrap.ObjectsList.GetValue(Target);

            if (AW == null)
            {
                SetError("Не найдена ссылка на объект", bw);

                return false;
            }

            return true;
        }

 public static bool CallAsFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool WriteResult)
        {
            result = null;
            NetObjectToNative.AutoWrap AW;
            if (!GetAW(br, bw, out AW))
                return false;



            string MethodName = br.ReadString();
            var args = GetArrayParams(br);

            string Error;
            List<int> ChageParams = new List<int>();

           
            var res = AW.TryInvokeMember(MethodName, args, out result, ChageParams, out Error);
            if (!res)
            {
                SetError(Error, bw);
                return false;
            }

           if (WriteResult)
            {
                bw.Write(true);
                WorkWhithVariant.WriteObject(NetObjectToNative.AutoWrap.WrapObject(result), bw);
                WriteChandeParams(bw, args, ChageParams);


            }
            return true;
        }
Re[8]: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.

S>>Ну не в одно.

AVK>Именно что в одно.


S>> Но обработку запросов кто писать будет?


AVK>Лямбды пока еще не отменили.

А лямбды кто писать будет?

По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка


static void SetResult(MemoryStream ms, NetworkStream ns)
        {
            ms.Position = 0;
            ns.Write(BitConverter.GetBytes((Int32)ms.Length), 0, 4);
            ms.CopyTo(ns);
            ns.Flush();


        }

 private void RunMethod(NetworkStream ns, MemoryStream ms, IPAddress adress)
        {
            using (BinaryReader br = new BinaryReader(ms))
            {
                var msRes = new MemoryStream();
                using(BinaryWriter bw= new BinaryWriter(msRes))
                { 
                    var cm = (CallMethod)br.ReadByte();
                   
                    switch (cm)
                    {
                        case CallMethod.CallFunc: CallAsFunc(br, bw); break;
                        case CallMethod.GetMember: GetPropVal(br, bw); break;
                        case CallMethod.SetMember: SetPropVal(br, bw); break;
                        case CallMethod.CallFuncAsync: CallAsyncFunc(br, bw, adress); break;
                        case CallMethod.CallDelegate: CallAsDelegate(br, bw); break;
                        case CallMethod.CallGenericFunc: CallAsGenericFunc(br, bw); break;
                        case CallMethod.GetWrapperForObjectWithEvents: GetWrapperForObjectWithEvents(br, bw, adress); break;
                        case CallMethod.GetIndex: GetIndex(br, bw); break;
                        case CallMethod.SetIndex: SetIndex(br, bw); break;
                        case CallMethod.IteratorNext: IteratorNext(br, bw); break;
                        case CallMethod.DeleteObjects: DeleteObjects(br, bw); break;

                    }

                    bw.Flush();
                    SetResult(msRes, ns);
                }

            }
        }
        private void ExecuteMethod(TcpClient client)
        {
            var adress=((IPEndPoint)client.Client.RemoteEndPoint).Address;
        //    client.Client.NoDelay = true;
            using (NetworkStream ns = client.GetStream())
            {

                // Получим данные с клиента и на основании этих данных
                //Создадим ДанныеДляКлиета1С котрый кроме данных содержит 
                //TcpClient для отправки ответа
                using (var br = new BinaryReader(ns))
                {
                    var streamSize = br.ReadInt32();

                    var res = br.ReadBytes(streamSize);

                    var ms = new MemoryStream(res);
                    ms.Position = 0;
                    RunMethod(ns, ms, adress);
                }



            }

        }




static bool  GetAW(BinaryReader br, BinaryWriter bw, out NetObjectToNative.AutoWrap  AW )
        {

            var Target = br.ReadInt32();

            AW = NetObjectToNative.AutoWrap.ObjectsList.GetValue(Target);

            if (AW == null)
            {
                SetError("Не найдена ссылка на объект", bw);

                return false;
            }

            return true;
        }

 public static bool CallAsFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool WriteResult)
        {
            result = null;
            NetObjectToNative.AutoWrap AW;
            if (!GetAW(br, bw, out AW))
                return false;



            string MethodName = br.ReadString();
            var args = GetArrayParams(br);

            string Error;
            List<int> ChageParams = new List<int>();

           
            var res = AW.TryInvokeMember(MethodName, args, out result, ChageParams, out Error);
            if (!res)
            {
                SetError(Error, bw);
                return false;
            }

           if (WriteResult)
            {
                bw.Write(true);
                WorkWhithVariant.WriteObject(NetObjectToNative.AutoWrap.WrapObject(result), bw);
                WriteChandeParams(bw, args, ChageParams);


            }
            return true;
        }