说明

RPC服务在被调用是,可以使用实现IRpcActionFilter特性(Attribute),进行相关AOP操作。

声明特性

  1. class MyRpcActionFilterAttribute : Attribute, IRpcActionFilter
  2. {
  3. /// <summary>
  4. /// 在执行RPC之前。
  5. /// <para>当<paramref name="invokeResult"/>的InvokeStatus不为<see cref="InvokeStatus.Ready"/>。则不会执行RPC</para>
  6. /// <para>同时,当<paramref name="invokeResult"/>的InvokeStatus为<see cref="InvokeStatus.Success"/>。会直接返回结果</para>
  7. /// </summary>
  8. /// <param name="caller"></param>
  9. /// <param name="invokeResult"></param>
  10. /// <param name="methodInstance"></param>
  11. /// <param name="ps"></param>
  12. public void Executing(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance, object[] ps)
  13. {
  14. if (caller is TcpTouchRpcSocketClient client)
  15. {
  16. client.Logger.Message($"即将执行RPC-{methodInstance.Name}");
  17. }
  18. }
  19. /// <summary>
  20. /// 成功执行后。
  21. /// <para>如果修改<paramref name="invokeResult"/>的InvokeStatus,或Result。则会影响RPC最终结果</para>
  22. /// </summary>
  23. /// <param name="caller"></param>
  24. /// <param name="invokeResult"></param>
  25. /// <param name="methodInstance"></param>
  26. public void Executed(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance)
  27. {
  28. if (caller is TcpTouchRpcSocketClient client)
  29. {
  30. client.Logger.Message($"执行RPC-{methodInstance.Name}完成,状态={invokeResult.Status}");
  31. }
  32. }
  33. /// <summary>
  34. /// 执行遇见异常。
  35. /// <para>如果修改<paramref name="invokeResult"/>的InvokeStatus,或Result。则会影响RPC最终结果</para>
  36. /// </summary>
  37. /// <param name="caller"></param>
  38. /// <param name="invokeResult"></param>
  39. /// <param name="methodInstance"></param>
  40. /// <param name="exception"></param>
  41. public void ExecutException(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance, Exception exception)
  42. {
  43. if (caller is TcpTouchRpcSocketClient client)
  44. {
  45. client.Logger.Message($"执行RPC-{methodInstance.Name}异常,信息={invokeResult.Message}");
  46. }
  47. }
  48. }

使用

  1. [Description("性能测试")]
  2. [TouchRpc]
  3. [MyRpcActionFilter]
  4. public int Performance(int a)
  5. {
  6. return a;
  7. }