AMHandler.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 where Request : ARequest where Response : AResponse
  23. {
  24. protected static void ReplyError(Response response, Exception e, Action<Response> reply)
  25. {
  26. Log.Error(e.ToString());
  27. response.Error = ErrorCode.ERR_RpcFail;
  28. response.Message = e.ToString();
  29. reply(response);
  30. }
  31. protected abstract void Run(Session session, Request message, Action<Response> reply);
  32. public void Handle(Session session, MessageInfo messageInfo)
  33. {
  34. try
  35. {
  36. Request request = messageInfo.Message as Request;
  37. if (request == null)
  38. {
  39. Log.Error($"消息类型转换错误: {messageInfo.Message.GetType().Name} to {typeof (Request).Name}");
  40. }
  41. this.Run(session, request, response =>
  42. {
  43. // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
  44. if (session.Id == 0)
  45. {
  46. return;
  47. }
  48. session.Reply(messageInfo.RpcId, response);
  49. });
  50. }
  51. catch (Exception e)
  52. {
  53. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  54. }
  55. }
  56. public Type GetMessageType()
  57. {
  58. return typeof (Request);
  59. }
  60. }
  61. }