说明
RPC服务在被调用是,可以使用实现IRpcActionFilter的特性(Attribute),进行相关AOP操作。
声明特性
class MyRpcActionFilterAttribute : Attribute, IRpcActionFilter
{
/// <summary>
/// 在执行RPC之前。
/// <para>当<paramref name="invokeResult"/>的InvokeStatus不为<see cref="InvokeStatus.Ready"/>。则不会执行RPC</para>
/// <para>同时,当<paramref name="invokeResult"/>的InvokeStatus为<see cref="InvokeStatus.Success"/>。会直接返回结果</para>
/// </summary>
/// <param name="caller"></param>
/// <param name="invokeResult"></param>
/// <param name="methodInstance"></param>
/// <param name="ps"></param>
public void Executing(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance, object[] ps)
{
if (caller is TcpTouchRpcSocketClient client)
{
client.Logger.Message($"即将执行RPC-{methodInstance.Name}");
}
}
/// <summary>
/// 成功执行后。
/// <para>如果修改<paramref name="invokeResult"/>的InvokeStatus,或Result。则会影响RPC最终结果</para>
/// </summary>
/// <param name="caller"></param>
/// <param name="invokeResult"></param>
/// <param name="methodInstance"></param>
public void Executed(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance)
{
if (caller is TcpTouchRpcSocketClient client)
{
client.Logger.Message($"执行RPC-{methodInstance.Name}完成,状态={invokeResult.Status}");
}
}
/// <summary>
/// 执行遇见异常。
/// <para>如果修改<paramref name="invokeResult"/>的InvokeStatus,或Result。则会影响RPC最终结果</para>
/// </summary>
/// <param name="caller"></param>
/// <param name="invokeResult"></param>
/// <param name="methodInstance"></param>
/// <param name="exception"></param>
public void ExecutException(object caller, ref InvokeResult invokeResult, MethodInstance methodInstance, Exception exception)
{
if (caller is TcpTouchRpcSocketClient client)
{
client.Logger.Message($"执行RPC-{methodInstance.Name}异常,信息={invokeResult.Message}");
}
}
}
使用
[Description("性能测试")]
[TouchRpc]
[MyRpcActionFilter]
public int Performance(int a)
{
return a;
}