AMRpcHandler.cs 2.1 KB

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