.net webapi 过滤器使用(异常日志)

常用的过滤器有三种:OnAuthorization、ActionFilterAttribute、ExceptionFilterAttribute

本文件主要记录使用ExceptionFilterAttribute记录接口的异常日志,包括请求参数、响应结果,耗时等

直接上代码:

 1 using Newtonsoft.Json;
 2 using ServiceRef;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.IO;
 6 using System.Linq;
 7 using System.Net;
 8 using System.Net.Http;
 9 using System.Net.Http.Headers;
10 using System.Text;
11 using System.Threading;
12 using System.Threading.Tasks;
13 using System.Web.Http;
14 using System.Web.Http.ExceptionHandling;
15 using System.Web.Http.Filters;
16 
17 namespace WebApi.App_Start
18 {
19     /// <summary>
20     /// 异常过滤器
21     /// </summary>
22     public class ExceptionFilter : ExceptionFilterAttribute
23     {       
24 
25         ///// <summary>
26         ///// 异步写异常
27         ///// </summary>
28         ///// <param name="actionExecutedContext"></param>
29         ///// <param name="cancellationToken"></param>
30         //public override async Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
31         //{
32         //    //1.获取异常信息
33         //    string errorMsg = actionExecutedContext.Exception.ToString();
34 
35         //    //2.对获取的异常信息进行处理
36         //    using (StreamWriter writer = File.AppendText("d:/err.txt"))
37         //    {
38         //        await writer.WriteLineAsync(errorMsg);
39         //    }
40         //}
41 
42         public override void OnException(HttpActionExecutedContext actionExcutedContext)
43         {
44             HttpRequestMessage request = actionExcutedContext.Request;
45             string controllerName = actionExcutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
46             string actionName = actionExcutedContext.ActionContext.ActionDescriptor.ActionName;
47             string content = request.Content.ReadAsStringAsync().Result;
48             string headers = GetCollections(request.Headers);
49             string exceptionMessage = actionExcutedContext.Exception.Message;
50             string exceptionTrace = actionExcutedContext.Exception.StackTrace;
51             string arguments = JsonConvert.SerializeObject(actionExcutedContext.ActionContext.ActionArguments);
52             string url = request.RequestUri.AbsoluteUri;
53             StringBuilder sb = new StringBuilder();
54             sb.AppendFormat("URL:{0}
", url);
55             sb.AppendFormat("Controller:{0}
", controllerName);
56             sb.AppendFormat("Action:{0}
", actionName);
57             sb.AppendFormat("Arguments:{0}
", arguments);
58             sb.AppendFormat("Content:{0}
", content);
59             sb.AppendFormat("Headers:{0}
", headers);
60             sb.AppendFormat("ExceptionMessage:{0}
", exceptionMessage);
61             sb.AppendFormat("ExceptionTrace:{0}
", exceptionTrace);
62             actionExcutedContext.Response = new HttpResponseMessage() { Content = new StringContent(sb.ToString()), StatusCode = System.Net.HttpStatusCode.InternalServerError };
63             //记录日志
64 
65             string errMsg = "";
66             sb.Clear();
67             sb = null;
68             base.OnException(actionExcutedContext);
69         }
70         /// <summary>
71         /// 获取Action 参数
72         /// </summary>
73         /// <param name="Collections"></param>
74         /// <returns></returns>
75         public string GetCollections(HttpRequestHeaders Collections)
76         {
77             string Parameters = string.Empty;
78             if (Collections == null || Collections.Count() == 0)
79             {
80                 return Parameters;
81             }
82             foreach (var coll in Collections)
83             {
84                 if (coll.Value.Count() > 0)
85                 {
86                     Parameters += string.Format("{0}={1}&", coll.Key, coll.Value.FirstOrDefault().ToString());
87                 }
88             }
89             if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&"))
90             {
91                 Parameters = Parameters.Substring(0, Parameters.Length - 1);
92             }
93             return Parameters;
94         }
95     }
96 }
View Code
原文地址:https://www.cnblogs.com/hvaning/p/14986491.html