处理客户端远程端关闭异常
本文关键字:异常 程端关 客户端 处理 | 更新日期: 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()