AMRpcHandler.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. namespace ETModel
  3. {
  4. public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : class, IRequest where Response : class, IResponse
  5. {
  6. protected abstract ETTask Run(Session session, Request request, Response response, Action reply);
  7. public async ETVoid Handle(Session session, object message)
  8. {
  9. try
  10. {
  11. Request request = message as Request;
  12. if (request == null)
  13. {
  14. Log.Error($"消息类型转换错误: {message.GetType().Name} to {typeof (Request).Name}");
  15. }
  16. int rpcId = request.RpcId;
  17. long instanceId = session.InstanceId;
  18. Response response = Activator.CreateInstance<Response>();
  19. void Reply()
  20. {
  21. // 等回调回来,session可以已经断开了,所以需要判断session InstanceId是否一样
  22. if (session.InstanceId != instanceId)
  23. {
  24. return;
  25. }
  26. response.RpcId = rpcId;
  27. session.Reply(response);
  28. }
  29. try
  30. {
  31. await this.Run(session, request, response, Reply);
  32. }
  33. catch (Exception e)
  34. {
  35. Log.Error(e);
  36. response.Error = ErrorCode.ERR_RpcFail;
  37. response.Message = e.ToString();
  38. Reply();
  39. }
  40. }
  41. catch (Exception e)
  42. {
  43. Log.Error($"解释消息失败: {message.GetType().FullName}\n{e}");
  44. }
  45. }
  46. public Type GetMessageType()
  47. {
  48. return typeof (Request);
  49. }
  50. }
  51. }