处理客户端远程端关闭异常

本文关键字:异常 程端关 客户端 处理 | 更新日期: 2023-09-27 17:49:28

当我把我的thrift客户端引用放在using块中时,我得到一个TTransportException: "Cannot read, Remote side has closed exception."

//THRIFT IDL
namespace csharp ReferenceData.API
exception EntityDoesNotExistException {
    1: string Key;  
}
service ReferenceDataService {
    bool HelloWorld() throws (1: EntityDoesNotExistException entityDoesNotExistException);
}
namespace Server
{
    public class Service: ReferenceDataService.Iface
    {
        public bool HelloWorld()
        {
            throw new EntityDoesNotExistException(){Key = "TEST KEY"};
        }
    }
}
namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var processor = new ReferenceData.API.ReferenceDataService.Processor(new Service());
                TServerTransport serverTransport = new TServerSocket(9094);
                TServer server = new TThreadedServer(processor, serverTransport);
                Console.WriteLine("Running the Payroll Service on port {0}...", "9094");
                server.Serve();
            }
            catch (Exception x)
            {
               Console.WriteLine(x.StackTrace);
            }
            Console.ReadLine();
        }
    }
}

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            var transport = new Thrift.Transport.TSocket("127.0.0.1", 9094);
            transport.Open();
            var service = new ReferenceDataService.Client(new Thrift.Protocol.TBinaryProtocol(transport)); 
            using (service)
            {
                try
                {
                    service.HelloWorld();
                }
                catch (EntityDoesNotExistException ex)
                {
                    Console.WriteLine(ex.Key);
                }
            }
            Console.ReadLine();
        }
    }
}

远程方法调用实际上成功了,但是我观察到Processor。方法被调用两次,第二次调用触发异常。Process方法应该被调用两次吗?如果我像这样显式地调用Dispose,我认为我应该这样做,以便尽快关闭套接字。

处理客户端远程端关闭异常

行为是由设计的。

Process()方法被调用,直到连接结束,通常是因为客户端断开连接。在这种情况下,ReadMessageBegin()失败了,这个异常是预期的,并在tthreaddserver .cs中捕获,就在Process()循环的下面。

对于好奇的:在TTransport.ReadAll()

中抛出异常