C# 正在处理thrift客户端-远程端关闭异常

C# 正在处理thrift客户端-远程端关闭异常,c#,soa,thrift,C#,Soa,Thrift,当我将我的thrift客户端引用放入using块时,我得到一个TTTransportException:“无法读取,远程端已关闭异常。” 远程方法调用实际上成功了,但我观察到Processor.Process方法被调用了两次,触发异常的是第二次调用。是否应该调用Process方法两次?如果我像这样显式调用Dispose,我假设我应该这样做,以便尽快关闭套接字。这种行为是经过设计的 调用Process()方法直到连接结束,通常是因为客户端断开连接。在这种情况下,ReadMessageBegin()

当我将我的thrift客户端引用放入using块时,我得到一个TTTransportException:“无法读取,远程端已关闭异常。”


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

这种行为是经过设计的

调用
Process()
方法直到连接结束,通常是因为客户端断开连接。在这种情况下,
ReadMessageBegin()
将失败,出现此异常,该异常在
Process()
循环的正下方

对于好奇的人来说:例外是

//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();
        }
    }
}