我正在尝试将我的asp.net web API项目中的所有请求记录到文本文件中。我正在使用DelegationHandler
功能在我的应用程序中实现日志记录机制,下面是该代码片段,
public class MyAPILogHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// Captures all properties from the request.
var apiLogEntry = CreateApiLogEntryWithRequestData(request);
if (request.Content != null)
{
await request.Content.ReadAsStringAsync()
.ContinueWith(task =>
{
apiLogEntry.RequestContentBody = task.Result;
}, cancellationToken);
}
return await base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;
// Update the API log entry with response info
apiLogEntry.ResponseStatusCode = (int)response.StatusCode;
apiLogEntry.ResponseTimestamp = DateTime.Now;
if (response.Content != null)
{
apiLogEntry.ResponseContentBody = response.Content.ReadAsStringAsync().Result;
apiLogEntry.ResponseContentType = response.Content.Headers.ContentType.MediaType;
apiLogEntry.ResponseHeaders = SerializeHeaders(response.Content.Headers);
}
var logger = new LogManager();
logger.Log(new LogMessage()
{
Message = PrepareLogMessage(apiLogEntry),
LogTo = LogSource.File
});
return response;
}, cancellationToken);
}
}
以上实现按预期工作,并将所有必需的请求/响应信息记录到文件中。
但是当我们使用附加的一些图像进行任何multipart / form-data POST api调用时,在记录此请求之后,日志文件变得很大,因为所有图像/二进制内容都被转换为字符串并将其写下文本文件。请在下面找到日志文件内容,
Body:
----------------------------079603462429865781513947
Content-Disposition: form-data; name="batchid"
22649EEE-3994-4225-AF73-D9A6B659CAE3
----------------------------079603462429865781513947
Content-Disposition: form-data; name="files"; filename="d.png"
Content-Type: image/png
PNG
IHDR í %v ¸ sRGB ®Îé gAMA ±üa pHYs à ÃÇo¨d ÿ¥IDATx^ìýX]K¶(
·îsß»ß÷þï{O÷iÛ Á2âîîîÁe¹âîî,<@ Á$÷w_ÈZó5$Dwvv×}
----------------------------4334344396037865656556781513947
Content-Disposition: form-data; name="files"; filename="m.png"
Content-Type: image/png
PNG
IHDR í %v ¸ sRGB ®Îé gAMA ±üa pHYs à ÃÇo¨d ÿ¥IDATx^ìýX]K¶(
·îsß»ß÷þï{O÷iÛ Á2âîîîÁe¹âîî,<@ Á$÷w_ÈZó5$Dwvv×}
我不想记录请求体的二进制内容,只记录请求体文件内容就好了,
----------------------------079603462429865781513947
Content-Disposition: form-data; name="batchid"
22649EEE-3994-4225-AF73-D9A6B659CAE3
----------------------------079603462429865781513947
Content-Disposition: form-data; name="files"; filename="d.png"
Content-Type: image/png
----------------------------4334344396037865656556781513947
Content-Disposition: form-data; name="files"; filename="m.png"
Content-Type: image/png
您能否建议如何防止记录请求正文的二进制内容,并仅记录请求正文的文件内容。
答案 0 :(得分:1)
从我收集的内容来看,您正在实施与this方法类似的内容。 上传文件时(即请求类型&#34; multipart / form-data&#34; ),其实际内容始终以&#34; Content-Type:{ContentTypeValue开头} \ r \ n \ r \ n &#34;序列和下一个标题以&#34; \ r \ n - &#34; 序列开头(如日志中所示)。您可以在ReferenceSource探索有关原始请求数据解析的更多信息。因此,您可以删除有关文件的所有内容(如果存在),例如,通过RegEx:
Content-Type:{ContentTypeOrOctetStream} \ r \ n \ r \ n {FileContentBytesToRemove} \ r \ n
using System.Text.RegularExpressions;
...
string StripRawFileContentIfExists(string input) {
if(input.IndexOf("Content-Type") == -1)
return input;
string regExPattern = "(?<ContentTypeGroup>Content-Type: .*?\\r\\n\\r\\n)(?<FileRawContentGroup>.*?)(?<NextHeaderBeginGroup>\\r\\n--)";
return Regex.Replace(input, regExPattern, me => me.Groups["ContentTypeGroup"].Value + string.Empty + me.Groups["NextHeaderBeginGroup"].Value);
}
...
//apiLogEntry.RequestContentBody = task.Result;
apiLogEntry.RequestContentBody = StripRawFileContentIfExists(task.Result);
答案 1 :(得分:0)
我建议从日志中单独huge content
。就像你遇到的那样,它只是将日志中的所有内容都搞定了。在某种程度上禁用日志功能。
我建议您在文件系统中组织huge content
。{I}。像这样:
---request-a/
|--request-a-body-multi-part1.txt
|--request-a-body-multi-part2.txt
并在日志中维护一个链接以引用此文件系统路径。
希望它有所帮助。