1.创建一个类名字叫做CustomActionFilter.cs
/// <summary>
///
/// </summary>
public class CustomActionFilter : System.Web.Http.Filters.ActionFilterAttribute
{
/// <summary>
///
/// </summary>
/// <param name="actionExecutedContext"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
HttpRequest request = HttpContext.Current.Request;
string token = request.Headers["token"];
string strUserName = null;
try
{
strUserName = AesUtil.Decrypt(token, UserInformation.strGuid);
}
catch (Exception ex)
{
throw new Exception($"token:【{token}】无效");
}
if (string.IsNullOrWhiteSpace(strUserName))
throw new Exception($"token:【{token}】无效");
var obj= DependencyInjection.Container.ICustomTableOperations.userInformation(strUserName);
if (obj.IntCode == ReturnState.失败)
throw new Exception(obj.strErr);
// 获取request提交的参数
var Paramaters = GetRequestValues(actionExecutedContext);
// 获取response响应的结果
var ExecuteResult = GetResponseValues(actionExecutedContext);
dynamic data = JsonConvert.DeserializeObject(ExecuteResult);
// 获取访问的ip
var UserHostAddress = request.UserHostAddress;
//请求地址
var path = request.AppRelativeCurrentExecutionFilePath;
return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);
}
public string GetRequestValues(HttpActionExecutedContext actionExecutedContext)
{
Stream stream = actionExecutedContext.Request.Content.ReadAsStreamAsync().Result;
stream.Position = 0;
Encoding encoding = Encoding.UTF8;
/*
这个StreamReader不能关闭,也不能dispose
因为你关掉后,后面的管道 或拦截器就没办法读取了
*/
var reader = new StreamReader(stream, encoding);
string result = reader.ReadToEnd();
/*
这里也要注意: stream.Position = 0;
当你读取完之后必须把stream的位置设为开始
因为request和response读取完以后Position到最后一个位置,交给下一个方法处理的时候就会读不到内容了。
*/
stream.Position = 0;
return result;
}
public string GetResponseValues(HttpActionExecutedContext actionExecutedContext)
{
Stream stream = actionExecutedContext.Response.Content.ReadAsStreamAsync().Result;
stream.Position = 0;
Encoding encoding = Encoding.UTF8;
/*
这个StreamReader不能关闭,也不能dispose,
因为你关掉后,后面的管道 或拦截器就没办法读取了
*/
var reader = new StreamReader(stream, encoding);
string result = reader.ReadToEnd();
/*
这里也要注意: stream.Position = 0;
当你读取完之后必须把stream的位置设为开始
因为request和response读取完以后Position到最后一个位置,交给下一个方法处理的时候就会读不到内容了。
*/
stream.Position = 0;
return result;
}
}
2.在控制器上方加上
[CustomActionFilter]
这样就可以方便打印日志啦