停止控制器活动OperationId流向发送的消息

时间:2018-06-15 08:08:39

标签: c# asp.net-core-webapi

我有一个带有单个控制器的web api core 2.1应用程序。此控制器采用一个没有属性的Post。我使用这篇文章作为启动某些功能的方法。当我收到Post时,我调用一个函数来生成多个任务,每个任务都有一个延迟,然后通过HttpClient发送一条消息。这基本上模仿了多个设备将数据发送到我的端点。我发现的是,原始帖子中的OperationId正在流向所有已发送的消息。此功能不是我想要的,因为从应用程序见解中查看时,所有已发送的消息都链接在一起,因为它们都使用相同的OperationId。我想要做的是在通过单个HttpClient发送的每条消息中使用一个唯一的OperationId。

以下是一些用于延迟发送消息的代码。未显示的“heartbeat”对象,只是添加相关的消息文本,然后对传入的HttpClient执行SendAsync。

通过原始帖子调用的“for”循环多次调用StartWork函数。

    private async Task StartWork(IHeartbeat heartbeat, int heartbeatInterval, CancellationToken cancellation)
    {
        await Task.Delay(TimeSpan.FromSeconds(_rnd.Next(1, heartbeatInterval)), cancellation);
        await DoWork(heartbeat, heartbeatInterval, cancellation);
    }

    private async Task DoWork(IHeartbeat heartbeat, int heartbeatInterval, CancellationToken cancellation)
    {
        if (!cancellation.IsCancellationRequested)
        {
            await InvokeHeartbeat(heartbeat, cancellation);

            Task.Delay(TimeSpan.FromSeconds(heartbeatInterval), cancellation)
                .ContinueWith(t => DoWork(heartbeat, heartbeatInterval, cancellation), cancellation);
        }
    }

    private async Task InvokeHeartbeat(IHeartbeat heartbeat, CancellationToken cancellation)
    {
        if (!cancellation.IsCancellationRequested)
        {
            await heartbeat.Send(_client, _host, _stopwatch, _logger, cancellation);
        }
    }

有没有办法修改“InvokeHeartbeat”函数中发送的每条消息的OperationId?

为清楚起见,我正在讨论的OperationId可以使用以下内容查看:

Activity.Current.Id;

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要创建新活动,以便在拨打电话时获得不同的ID。

请查看此文档:https://github.com/dotnet/corefx/blob/master/src/System.Diagnostics.DiagnosticSource/src/ActivityUserGuide.md

特别是"创建儿童活动"部分。