using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;

namespace VirtualRemote.log4net
{
public class LogHandler : ICallHandler
{
/// <summary>
/// ICallHandler的成员,表执行顺序
/// </summary>
public int Order
{
get;
set;
}

//每条记录 的拼接.记录
private void Log(ref System.Text.StringBuilder sb,string format, params object[] args)
{
string tmp = string.Format(format, args);
sb.AppendLine(tmp);
VirtualRemote.Common.Debug(tmp);
}

public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{

System.Text.StringBuilder sb = new StringBuilder();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
IMethodReturn retvalue = getNext()(input, getNext);//在这里执行方法
sw.Stop();

Log(ref sb, "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
Log(ref sb, "┃方法名: {0}",input.MethodBase.Name);

//((Microsoft.Practices.Unity.InterceptionExtension.ParameterCollection)(retvalue.Outputs)).arguments

object value;
for (var i = 0; i < input.Arguments.Count; i++)
{
var arg = input.Arguments.GetParameterInfo(i);
if (arg.IsOut || arg.IsRetval)
{
//if (retvalue.Outputs.ContainsParameter(arg.Name))
value = retvalue.Outputs[arg.Name];
}
else
{
value = input.Arguments[i];
}
Log(ref sb, "┃参数〖{0}.{1}〗= {2}", i, arg.Name, GetObjectString(value));
}

if (retvalue.Exception == null) // retvalue.Exception=null说明函数执行时没有抛出异常
{
var returnvalue = retvalue.ReturnValue;
if (returnvalue != null)
{
Log(ref sb, "┃返回值: {0}", GetObjectString(returnvalue));
}
else
{
Log(ref sb, "┃返回值: {0}","void");
}
}
else
{
Log(ref sb, "★ {0}",retvalue.Exception.ToString());
//retvalue.Exception = null; // 将retvalue.Exception设为null表示异常已经被处理过了,
// 如果不把retvalue.Exception设为null,Unity会再次抛出此异常。
}
Log(ref sb, "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 运行时间:{0} 毫秒", sw.ElapsedMilliseconds.ToString());

sb.Insert(0, System.Environment.NewLine);
if (retvalue.Exception == null)
{
VirtualRemote.Common.Info(sb.ToString());
}
else
{
VirtualRemote.Common.Error(sb.ToString());
}
return retvalue;
}

public static string GetObjectString(object value)
{
if (value==null)
{
return "null";
}
if (value is string)
{
}
else if (value.GetType().IsClass)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(value);
}
return value.ToString();
}

}

}

以前写的一段aop,远程接口调用的日志。的更多相关文章

  1. HttpClient远程接口调用-实名认证

    1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...

  2. SmartRoute之远程接口调用和负载

    基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口 ...

  3. HttpClient 远程接口调用方式

    远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端.   Httpclient简介 什么是httpclient Htt ...

  4. 【RPC】远程接口调用实例 的几种方式比较

    pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...

  5. RMI(远程接口调用)

    1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传输层(Transport ...

  6. java之远程接口调用

    一.通过地址栏传值 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  7. SpringBoot远程接口调用-RestTemplate使用

    在web服务中,调度远程url是常见的使用场景,最初多采用原生的HttpClient,现采用Spring整合的RestTemplate工具类进行.实操如下: 1. 配置 主要用以配置远程链接的相关参数 ...

  8. [go]grpc远程接口调用实现

    // grpc序列化/反序列化成对应语言的对象 // 1.写idl(数据类型+方法) // 2.生成对应语言的序列化/反序列化代码 // 3.方法需要自己实现 // 环境(将gopath/bin加入p ...

  9. .Net core使用XRPC创建远程接口的Actor对象

    Actor是一种高并发处理模型,每个Actor都有着自己的状态有序消息处理机制,所以在业务处理的情况并不需要制定锁的机制,从而达到更高效的处理能性.XRPC是一个基于远程接口调用的RPC组件,它可以简 ...

随机推荐

  1. Retrofit2.0起步篇

    retrofit 英文名字是改装的意思,也就是说他是对网络请求的一种改装,他不负责进行网络请求,他是对请求方式的一种封装.真正进行网络请求的是okhttp. 以下所有内容在Android Studio ...

  2. 对jquery操作复选框

    摘要:jquery操作复选框.使用更简洁易懂,思路清晰,逻辑更明了,很实用 <!DOCTYPE html> <html> <head> <meta chars ...

  3. 【WCF】操作选择器

    在开始吹牛之前,先说说.net Core的事情. 你不能把.NET Core作为全新体系来学习,因为它也是.NET.关于.NET Core,老周并不打算写什么,因为你懂了.NET,就懂了.NET Co ...

  4. !+"\v1" 用来“判断浏览器类型”还是用来“IE判断版本”的问题!

    这种写法是利用各浏览器对转义字符"\v"的理解不同来判断浏览器类型.在IE中,"\v"没有转义,得到的结果为"v".而在其他浏览器中&quo ...

  5. Linux epoll

    一. epoll函数集 epoll主要有三个函数: 1. int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大.这个参数不同于 ...

  6. 神秘的 shadow-dom 浅析

    说到 shadow-dom 可能很多人会很陌生.但是其实我们肯定碰到过,本文主要想简单介绍下 shadow-dom.下面直接进入正文. shadow-dom 是什么 顾名思义, shadow-dom, ...

  7. Node.js:DNS模块的使用

    Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具. 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组 ...

  8. nginx 基础

    同步和阻塞,异步和非阻塞 http://yaocoder.blog.51cto.com/2668309/1308899  (51CTO) https://segmentfault.com/a/1190 ...

  9. 在 Windows Phone 中,为 Grid 添加 Tilt 效果

    在 Windows Phone 中,Tilt 效果是比较经典的效果,我们可以很简单的为按钮等控件添加这样的效果(使用 Windows Phone Toolkit 的Tilt 效果),但是,如果我们想要 ...

  10. 解决微信授权回调页面域名只能设置一个的问题 [php]

    最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_proxy,详细的介绍请往下阅读. 在做项目集成微信登录以及微信支付的时候,都需要进行用户授权.这 ...