如何在 .NET Core 中使用异步代码记录干净的堆栈跟踪?

问题描述

我有一个带有调用外部依赖项的异步方法的服务(这里有一个虚假的实现,仅用于演示目的):

public class RandomNumberService : IRandomNumberService
{
    private readonly IHttpClientFactory _httpClientFactory;

    public RandomNumberService(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory;

    public async Task<int> GetRandomNumber()
    {
        HttpClient client = _httpClientFactory.CreateClient();
        HttpResponseMessage response = await client.GetAsync(@"http://www.randomnumberapi.com/api/v1.0/random?min=1&max=10&count=1");
        int[]? result = await response.Content.ReadFromJsonAsync<int[]>();

        if (!response.IsSuccessstatusCode || result == null || !result.Any())
        {
            var stackTrace = new StackTrace().ToString();
            // log error with the stack trace

            return 42;
        }

        int number = result.First();

        return number;
    }
}

可以从多个地方调用此服务,因此当发生错误时,我想用有用的堆栈跟踪记录它,但在我的 stackTrace 变量中,我得到以下恐怖:

   at AsyncStackTraces.Services.RandomNumberService.GetRandomNumber()
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.ExecutionContextCallback(Object s)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext(Thread threadPoolThread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AsyncStateMachineBox`1.MoveNext()
   ... and 125 more lines of System stuff

问题是在堆栈跟踪中没有任何地方看到我的服务的调用者,这对调试错误很有用。

编辑: 我见过这个 similar questionBen.Demystifier 不满足我的需要,因为我没有处理异常,而且 EnhancedStackTrace.Current() 不提供完整的堆栈跟踪(它不'不包含服务的名称或其调用者):

有没有办法让完整(和干净的)堆栈跟踪记录下来?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)