Sendasync 已停止工作,未发布来自 swagger 的数据

Sendasync has stopped working , Not Posting data from swagger

提问人:Shri 提问时间:6/3/2022 最后编辑:JackdawShri 更新时间:6/7/2022 访问量:100

问:

控制器代码:

[HttpPost]
[Route("mood")]
public async Task<IActionResult> ProcessMoodProfile([FromBody] MoodTelemetryDTO moodProfile)
{
    string userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
                 
    var result = await _moodDataService.ProcessMoodTelemetryData(userId, moodProfile).ConfigureAwait(false);
    return Ok(HttpStatusCode.Created);
}

数据服务代码:

public async Task<bool> ProcessMoodTelemetryData(string userId, MoodTelemetryDTO moodTelemetry)
{
    try
    {
        var moodProfile = mapper.Map<MoodTelemetryProfile>(moodTelemetry);
        moodProfile.CreatedAt = moodTelemetry.CreatedDate.Date;
        moodProfile.UserId = new Guid(userId);
        return await _sendTelemetryData.SendMessageAsync(TelemetryType.MoodTelemetry, userId, JsonConvert.SerializeObject(moodProfile), new System.Threading.CancellationToken()).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Unable to process telemetry data. MethodName {methodname}", nameof(ProcessMoodTelemetryData));
        return false;
    }
}

EventHubTelemetrySinkService

public async Task<bool> SendMessageAsync(TelemetryType telemetryType, string partitionKey, string messagejson, CancellationToken cancellationToken)
{
    var status = false;
    _client = _sink[telemetryType];
    if (_client == null)
    {
        _logger.LogError("User telemetry data processes successfully but no sink found for the telemetry type {telemetryType}", telemetryType);
    }

    using (_logger.BeginScope("Send Message"))
    {
        _logger.LogInformation($"Message to be send {messagejson}");
        _logger.LogInformation($"Type of Telemetry {telemetryType}");

        var data = new Microsoft.Azure.EventHubs.EventData(Encoding.UTF8.GetBytes(messagejson));

        try
        {
            await SendMessageInternalAsync(data, partitionKey, cancellationToken).ConfigureAwait(false);
            status = true;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error Sending Message. Method {methodName}", nameof(SendMessageAsync));
        }
        data.Dispose();
    }
    return status;
}

private async Task SendMessageInternalAsync(Microsoft.Azure.EventHubs.EventData messgae, string partitionKey, CancellationToken cancellationToken)
{
    var success = false;
    var attempt = 0;
    using (_logger.BeginScope("Send Message Internal"))
    {
        do
        {
            try
            {
                await _client.SendAsync(messgae, partitionKey).ConfigureAwait(false);
                var response = _client.SendAsync(messgae, partitionKey).ConfigureAwait(false);
                success = true;
            }
            catch (Exception ex)
            {
                if (attempt == _messageRetryCount || cancellationToken.IsCancellationRequested)
                {
                    _logger.LogError(ex, "Internal message retry exceeded or cancellation invoked. method {methodname}", nameof(SendMessageInternalAsync));
                }
            }
        } while (!success && ++attempt <= _messageRetryCount && !cancellationToken.IsCancellationRequested);
    }
}

这段代码工作得更早,但几天后它就停止工作了。Sendasync 函数接收所有值,没有异常,但值仍未存储在数据库中。

C# ASP.NET-核心 ASP.NET-web-API SendaSync

评论

0赞 Community 6/4/2022
请编辑问题,将其限制为具有足够详细信息的特定问题,以确定适当的答案。
0赞 Rena 6/6/2022
嗨,@Shri,您是否在 api 上设置了断点来调试代码并检查 api 是否返回任何错误?
0赞 Shri 6/6/2022
嗨,@Rena,是的,我调试了整个代码,但没有出现任何异常
0赞 mason 6/7/2022
我看到您正在使用的几个地方.你为什么要这样做?.ConfigureAwait(false)
1赞 derpirscher 6/7/2022
为什么你打了两次电话,但只等了一次?这似乎很奇怪_client.SendAsync()

答: 暂无答案