-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMessageLoggingHandler.cs
More file actions
100 lines (82 loc) · 3.7 KB
/
MessageLoggingHandler.cs
File metadata and controls
100 lines (82 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
namespace App.Web.Handlers
{
/// <summary>
/// MessageLoggingHandler handles all api request and responses and add logs base on them.
/// </summary>
public class MessageLoggingHandler : DelegatingHandler
{
public const string RegexRemoveNewLineExpression = @"\r\n?|\n";
private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var correlationId = Guid.NewGuid().ToString();
var loggingInfo = ExtractLoggingInfoFromRequest(request, correlationId);
var response = base.SendAsync(request, cancellationToken);
loggingInfo = ExtractResponseLoggingInfo(loggingInfo, response.Result);
WriteLoggingInfo(loggingInfo);
return response;
}
private ApiLoggingInfo ExtractLoggingInfoFromRequest(HttpRequestMessage request, string correlationId)
{
var info = new ApiLoggingInfo
{
RequestTime = DateTime.Now.ToLongTimeString(),
CorrelationId = correlationId,
HttpMethod = request.Method.Method,
UriAccessed = request.RequestUri.AbsoluteUri,
IPAddress = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "0.0.0.0"
};
ExtractMessageHeadersIntoLoggingInfo(info, request.Headers.ToList());
if (request.Content != null)
{
var byteResponse = request.Content.ReadAsByteArrayAsync().Result;
info.BodyContent = Regex.Replace(System.Text.UTF8Encoding.UTF8.GetString(byteResponse), RegexRemoveNewLineExpression, string.Empty);
}
return info;
}
private ApiLoggingInfo ExtractResponseLoggingInfo(ApiLoggingInfo loggingInfo, HttpResponseMessage result)
{
loggingInfo.ResponseTime = DateTime.Now.ToLongTimeString();
if (result != null)
{
loggingInfo.ResponseCode = ((int)result.StatusCode).ToString();
loggingInfo.ResponseReasonPhrase = result.ReasonPhrase;
}
return loggingInfo;
}
private void ExtractMessageHeadersIntoLoggingInfo(ApiLoggingInfo info, List<KeyValuePair<string, IEnumerable<string>>> headers)
{
info.RequestHeaders = headers;
}
private void WriteLoggingInfo(ApiLoggingInfo requestLoggingInfo)
{
Logger.Info(JsonConvert.SerializeObject(requestLoggingInfo));
}
/// <summary>
/// Request/response logging info class.
/// </summary>
public sealed class ApiLoggingInfo
{
public string CorrelationId { get; set; }
public string RequestTime { get; set; }
public string ResponseTime { get; set; }
public string HttpMethod { get; internal set; }
public string UriAccessed { get; internal set; }
public string IPAddress { get; internal set; }
public string BodyContent { get; internal set; }
public string ResponseCode { get; internal set; }
public string ResponseReasonPhrase { get; internal set; }
public List<KeyValuePair<string, IEnumerable<string>>> RequestHeaders { get; internal set; }
}
}
}