AMRpcHandler.cs 2.1 KB

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