【发布时间】:2018-08-07 05:34:02
【问题描述】:
我正在使用带有 C# 的 asp.net core v2.1 并制作了一个小型网站。这个网站有ExceptionsTracker 捕获所有未处理的异常。
internal class ExceptionTracker : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
// ...
string httpRequestInformation;
try
{
httpRequestInformation = context.HttpContext.Request.ToString(); // The problem here.
}
catch (Exception)
{
httpRequestInformation = string.Empty;
}
// ...
}
}
这背后的主要思想是将所有异常写入日志并能够在开发时重现它(运行产生异常的相同查询)。
当我使用之前的 .NET 框架 (v4.6) 制作这条线时
context.HttpContext.Request.ToString(),返回值是一个字符串,其中包含来自请求的所有信息(请求的 URL、标头、正文等)。当我使用 .net core 进行操作时,返回值为
Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest
你有更好的解决方案然后手动构造这个字符串吗?
谢谢!
更新
根据@kennyzx 的建议,我做了一个简短的方法扩展来解决这个问题。
public static class HttpRequestExtensions
{
public static string GetDetails(this HttpRequest request)
{
string baseUrl = $"{request.Scheme}://{request.Host}{request.Path}{request.QueryString.Value}";
StringBuilder sbHeaders = new StringBuilder();
foreach (var header in request.Headers)
sbHeaders.Append($"{header.Key}: {header.Value}\n");
string body = "no-body";
if (request.Body.CanSeek)
{
request.Body.Seek(0, SeekOrigin.Begin);
using (StreamReader sr = new StreamReader(request.Body))
body = sr.ReadToEnd();
}
return $"{request.Protocol} {request.Method} {baseUrl}\n\n{sbHeaders}\n{body}";
}
}
如果您有更好的解决方案,请告诉我。
【问题讨论】:
标签: c# asp.net asp.net-core .net-core