小编Nom*_*mad的帖子

在ASP.NET Core上实现"Fire and Forget"方法的安全方法

我正在尝试实现一个简单的日志库,它将用于多个项目.库的工作是将HTTP请求发送到ElasticSearch.这个库的要点是它不能等待响应.另外,我不关心任何错误/异常.它必须将请求发送到ElasticSearch,并立即返回.我不想用返回类型创建接口Task,我希望它们留下来void.

以下是我的示例代码.这是"火与忘"的正确和安全的实施吗?如果我Task.Run()在高负载库中使用它可以吗?或者我应该避免Task.Run()在我的情况下使用?另外,如果我不使用awaitTask.Run(),将我阻塞线程?此代码在库中:

public enum LogLevel
{
    Trace = 1,
    Debug = 2,
    Info = 3,
    Warn = 4,
    Error = 5,
    Fatal = 6
}

public interface ILogger
{
    void Info(string action, string message);
}

public class Logger : ILogger
{
    private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { Proxy = null, UseProxy = false });
    private static IConfigurationRoot _configuration;

    public Logger(IConfigurationRoot configuration)
    {
        _configuration = …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task async-await asp.net-core

7
推荐指数
1
解决办法
2299
查看次数

如何在 .NET Core 上正确实现 kafka 消费者作为后台服务

我通过在 .NET Core 2.2 上使用 BackgroundService 将 Kafka 使用者实现为控制台应用程序。我使用 confluent-kafka-dotnet v1.0.1.1 作为 Apache Kafka 的客户端。我不太确定如何处理每条消息。

  1. 由于处理每条消息可能需要一些时间(最多 24 小时),因此我为每条消息启动了一个新任务,这样我就不会阻止消费者使用新消息。我认为如果我的消息太多,每次创建一个新任务并不是正确的方法。那么处理每条消息的正确方法是什么?是否可以为每条消息创建某种动态后台服务?

  2. 如果一条消息已经在处理中,但应用程序崩溃或发生重新平衡,我最终会多次使用和处理相同的消息。我应该自动提交偏移量(或在它被消耗后立即提交)并将消息(或任务)的状态存储在某个地方,比如在数据库中?

我知道有 Hangfire,但我不确定是否需要使用它。如果我目前的方法完全错误,请给我一些建议。

下面是 ConsumerService 的实现:

public class ConsumerService : BackgroundService
{
    private readonly IConfiguration _config;
    private readonly IElasticLogger _logger;
    private readonly ConsumerConfig _consumerConfig;
    private readonly string[] _topics;
    private readonly double _maxNumAttempts;
    private readonly double _retryIntervalInSec;

    public ConsumerService(IConfiguration config, IElasticLogger logger)
    {
        _config = config;
        _logger = logger;
        _consumerConfig = new ConsumerConfig
        {
            BootstrapServers = _config.GetValue<string>("Kafka:BootstrapServers"),
            GroupId = _config.GetValue<string>("Kafka:GroupId"),
            EnableAutoCommit = _config.GetValue<bool>("Kafka:Consumer:EnableAutoCommit"), …
Run Code Online (Sandbox Code Playgroud)

c# apache-kafka .net-core confluent-platform

6
推荐指数
1
解决办法
4275
查看次数

在异步方法中使用时,HttpClient标头变为空

我使用的是.NET Framework 4.6.1.

我的web api中有一个控制器,我有静态HttpClient来处理所有的http请求.我在IIS上托管我的应用程序后,大约每月一次,对于我的应用程序的所有传入请求,我收到以下异常:

System.ArgumentNullException: Value cannot be null.
   at System.Threading.Monitor.Enter(Object obj)
   at System.Net.Http.Headers.HttpHeaders.ParseRawHeaderValues(String name, HeaderStoreItemInfo info, Boolean removeEmptyHeader)
   at System.Net.Http.Headers.HttpHeaders.AddHeaders(HttpHeaders sourceHeaders)
   at System.Net.Http.Headers.HttpRequestHeaders.AddHeaders(HttpHeaders sourceHeaders)
   at System.Net.Http.HttpClient.PrepareRequestMessage(HttpRequestMessage request)
   at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.PutAsync(Uri requestUri, HttpContent content, CancellationToken cancellationToken)
   at Attributes.Controllers.AttributesBaseController.<UpdateAttributes>d__6.MoveNext() in D:\Git\PortalSystem\Attributes\Controllers\AttributesBaseController.cs:line 42
Run Code Online (Sandbox Code Playgroud)

如果我在IIS上重新启动应用程序池,一切都会再次开始正常工作.这是我的代码:

public class AttributesBaseController : ApiController
{
    [Inject]
    public IPortalsRepository PortalsRepository { get; set; }

    private static HttpClient Client = new HttpClient(new HttpClientHandler { Proxy = null, …
Run Code Online (Sandbox Code Playgroud)

.net c# iis async-await

3
推荐指数
1
解决办法
1872
查看次数