AMHandler.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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;
  11. try
  12. {
  13. message = MongoHelper.FromBson<Message>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count);
  14. }
  15. catch (Exception e)
  16. {
  17. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  18. }
  19. this.Run(session, message);
  20. }
  21. public Type GetMessageType()
  22. {
  23. return typeof (Message);
  24. }
  25. }
  26. public abstract class AMRpcHandler<Request, Response> : IMHandler
  27. where Request : ARequest
  28. where Response: AResponse
  29. {
  30. protected abstract void Run(Session session, Request message, Action<Response> reply);
  31. public void Handle(Session session, MessageInfo messageInfo)
  32. {
  33. try
  34. {
  35. Request request = MongoHelper.FromBson<Request>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count);
  36. this.Run(session, request, response =>
  37. {
  38. // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
  39. if (session.Id == 0)
  40. {
  41. return;
  42. }
  43. session.Reply(messageInfo.RpcId, response);
  44. }
  45. );
  46. }
  47. catch (Exception e)
  48. {
  49. throw new Exception($"解释消息失败: {messageInfo.Opcode}", e);
  50. }
  51. }
  52. public Type GetMessageType()
  53. {
  54. return typeof(Request);
  55. }
  56. }
  57. }