AMHandler.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using Base;
  3. namespace Model
  4. {
  5. public abstract class AMHandler<Message>: IMHandler where Message: AMessage
  6. {
  7. protected abstract void Run(Session session, Message message);
  8. public void Handle(Session session, MessageInfo messageInfo)
  9. {
  10. Message message = messageInfo.Message as Message;
  11. if (message == null)
  12. {
  13. Log.Error($"消息类型转换错误: {messageInfo.Message.GetType().Name} to {typeof(Message).Name}");
  14. }
  15. this.Run(session, message);
  16. }
  17. public Type GetMessageType()
  18. {
  19. return typeof (Message);
  20. }
  21. }
  22. public abstract class AMRpcHandler<Request, Response> : IMHandler
  23. where Request : ARequest
  24. where Response: AResponse
  25. {
  26. protected static void ReplyError(Response response, Exception e, Action<Response> reply)
  27. {
  28. Log.Error(e.ToString());
  29. response.Error = ErrorCode.ERR_RpcFail;
  30. response.Message = e.ToString();
  31. reply(response);
  32. }
  33. protected abstract void Run(Session session, Request message, Action<Response> reply);
  34. public void Handle(Session session, MessageInfo messageInfo)
  35. {
  36. try
  37. {
  38. Request request = messageInfo.Message as Request;
  39. if (request == null)
  40. {
  41. Log.Error($"消息类型转换错误: {messageInfo.Message.GetType().Name} to {typeof(Request).Name}");
  42. }
  43. this.Run(session, request, response =>
  44. {
  45. // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
  46. if (session.Id == 0)
  47. {
  48. return;
  49. }
  50. session.Reply(messageInfo.RpcId, response);
  51. }
  52. );
  53. }
  54. catch (Exception e)
  55. {
  56. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  57. }
  58. }
  59. public Type GetMessageType()
  60. {
  61. return typeof(Request);
  62. }
  63. }
  64. }