hprose / hprose-dotnet

Hprose 3.0 for .NET
MIT License
383 stars 98 forks source link

客户端远程调用如何判断调用失败 #73

Closed lihaoru closed 2 years ago

lihaoru commented 3 years ago

客户端远程调用如何判断调用失败

好像用try catch跳不到异常

我用了一个错误的IP地址测试的,等了很长时间还是没有收到

try
            {
                var client = new Client(ConfigurationManager.AppSettings["DatabaseSevice"]);

                TypeManager.Register<calllog_Model>("calllog_Model");

                var proxy = client.UseService<ICalllogServer>();

                var calllogItem = new calllog_Model
                {
                    connecttime = item.TalkingTime,
                    dest = item.OtherNumber,
                    direction = (int)item.DirectionStatus,
                    extension = item.Ext,
                    flag1 = item.TalkingTime == DateTime.MinValue ? 0 : 1,
                    flag2 = 0,
                    hanguptime = item.EndTime,
                    starttime = item.BeginTime
                };

                var result = await client.InvokeAsync<int>("AddCallloglist", new object[] { calllogItem });
catch (Exception ex)
            {

            }
andot commented 3 years ago

调用失败是会有异常的,你 catch 里面没有做任何处理,我不知道你怎么判断没有异常的。

lihaoru commented 3 years ago

我调试的时候 设置了断点 没有走到catch的断点上

lihaoru commented 3 years ago

catch (Exception ex) { log.Error($"远端调用异常:{ex.Message}"); } 我现在在异常里打了异常信息,但是日志没有打印出来

lihaoru commented 3 years ago

调用失败是会有异常的,你 catch 里面没有做任何处理,我不知道你怎么判断没有异常的。

你好 刚才试了一下 如果是HTTP方式调用会返回错误 但是如果是TCP方式就不会

andot commented 3 years ago

没有异常,你打印结果会出结果吗?

lihaoru commented 3 years ago

我用demo也试过了 client把地址改成TCP://192.168.100.100 192.168.100.100 其实是不存在的 不会抛任何异常,也没有走正常返回的流程 什么都没有返回 如果是winform宿主的话 主界面就一直卡在那边了

测试的时候等了超过30分钟还是没有结果 异常也没有返回

static async Task RunClient() {
        var client = new Client("tcp://192.168.100.100:8080/");
        client.Use(new ConcurrentLimiter(64).Handler).Use(new RateLimiter(2000).InvokeHandler);
        var begin = DateTime.Now;
        var proxy = client.UseService<IMyService>();
        var n = 5000;
        var tasks = new Task<int>[n];
        for (int i = 0; i < n; ++i) {
            tasks[i] = proxy.Sum(i, i);
        }
        await Task.WhenAll(tasks);
        var end = DateTime.Now;
        Console.WriteLine(end - begin);
    }
andot commented 3 years ago

暂时想不到原因

andot commented 2 years ago

最新的 Hprose.RPC 3.0.20 版本已解决这个问题。原来是建立连接不在超时控制范围内,现在已经纳入超时范围控制之内了。