Merge branch 'master' of http://git.newlifex.com/NewLife/X
大石头 编写于 2018-09-25 18:53:17
X
using System;
using System.Linq;
using NewLife.Log;
using NewLife.Net;

namespace NewLife.Remoting
{
#if DEBUG
    /// <summary>Rpc测试</summary>
    [Api(null)]
    public class ApiTest
    {
        /// <summary>测试主函数</summary>
        public static void Main()
        {
            Console.WriteLine("模式(1服务端、2客户端)");
            var cki = Console.ReadKey(true);
            if (cki.KeyChar == '1')
                TestServer();
            else if (cki.KeyChar == '2')
                TestClient();
        }

        private static void TestServer()
        {
            var svr = new ApiServer(3344)
            {
                Log = XTrace.Log,
                EncoderLog = XTrace.Log
            };
            svr.Register<HelloController>();

            //var ns = svr.Server as NetServer;
            //ns.LogSend = true;
            //ns.LogReceive = true;

            svr.Start();

            Console.ReadKey();
        }

        private static async void TestClient()
        {
            var client = new ApiClient("tcp://127.0.0.1:3344")
            {
                Log = XTrace.Log,
                EncoderLog = XTrace.Log
            };

            //var sc = client.Client;
            //sc.LogSend = true;
            //sc.LogReceive = true;

            client.Open();

            var msg = "NewLifeX";
            Console.WriteLine();
            var rs = await client.InvokeAsync<String>("Say", new { msg });
            XTrace.WriteLine(rs);

            Console.WriteLine();
            rs = await client.InvokeAsync<String>("Hello/Eat", new { msg });
            XTrace.WriteLine(rs);

            Console.WriteLine();
            rs = await client.InvokeAsync<String>("Sleep", new { msg });
            XTrace.WriteLine(rs);

            Console.WriteLine();
            try
            {
                msg = "报错";
                rs = await client.InvokeAsync<String>("Say", new { msg });
            }
            catch (ApiException ex)
            {
                XTrace.WriteLine("服务端发生 {0} 错误:{1}", ex.Code, ex.Message);
            }

            Console.WriteLine();
            var apis = await client.InvokeAsync<String[]>("Api/All");
            Console.WriteLine(apis.Join(Environment.NewLine));

            Console.WriteLine("完成");
            Console.ReadKey();
        }

        [Api(null)]
        private class HelloController : IApi
        {
            public IApiSession Session { get; set; }

            [Api("Say")]
            public String Say(String msg)
            {
                if (msg == "报错") throw new Exception("出错,上一次 " + Session["Last"]);

                Session["Last"] = msg;

                var ss = Session.AllSessions;

                return "收到:{0} 在线:{1}".F(msg, ss.Length);
            }

            [Api("Hello/*")]
            public String Local()
            {
                var ctx = ControllerContext.Current;

                return "本地执行:{0}({1})".F(ctx.Action.Name, ctx.Parameters.Select(e => e.Key).Join(", "));
            }

            [Api("*")]
            public String Global()
            {
                var ctx = ControllerContext.Current;

                return "全局执行:{0}({1})".F(ctx.Action.Name, ctx.Parameters.Select(e => e.Key).Join(", "));
            }
        }
    }
#endif
}