AMRpcHandler.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using Cysharp.Threading.Tasks;
  3. namespace KYFramework.Network
  4. {
  5. public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : class, IRequest where Response : class, IResponse
  6. {
  7. protected abstract UniTask Run(Session session, Request message, Response response, Action reply);
  8. public void Handle(Session session, object message)
  9. {
  10. HandleAsync(session, message).Forget();
  11. }
  12. public Type GetMessageType()
  13. {
  14. return typeof (Request);
  15. }
  16. public async UniTask HandleAsync(Session session, object message)
  17. {
  18. try
  19. {
  20. Request request = message as Request;
  21. if (request == null)
  22. {
  23. Log.Error($"消息类型转换错误: {message.GetType().Name} to {typeof (Request).Name}");
  24. }
  25. int rpcId = request.RpcId;
  26. long instanceId = session.InstanceId;
  27. Response response = Activator.CreateInstance<Response>();
  28. void Reply()
  29. {
  30. if(session.InstanceId != instanceId)
  31. return;
  32. response.RpcId = rpcId;
  33. session.Reply(response);
  34. }
  35. try
  36. {
  37. await this.Run(session, request, response, Reply);
  38. }
  39. catch (Exception exception)
  40. {
  41. Log.Error(exception);
  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. }
  52. }