c# - Azure 事件中心 - 如何在 .Net Core WebAPI 中实现使用者?

标签 c# azure .net-core azure-eventhub webapi

因此,我需要在 WebAPI (.Net core 3.1) 应用程序中实现 Consumer,并阅读 Microsoft 文档并观看有关它的几个视频,我得到了这个解决方案。

这是 IServiceCollection 的扩展方法,我从 Startup.cs 调用它来实例化我的 Consumer(连接字符串和容器名称仅用于测试):

    private static async Task AddPropostaEventHub(this IServiceCollection services)
    {
        const string eventHubName = "EVENT HUB NAME";
        const string ehubNamespaceConnectionString = "EVENT HUB CONNECTION STRING";
        const string blobContainerName = "BLOB CONTAINER NAME";
        const string blobStorageConnectionString = "BLOB CONNECTION STRING";

        string consumerGroup = EventHubConsumerClient.DefaultConsumerGroupName;
        BlobContainerClient storageClient = new BlobContainerClient(blobStorageConnectionString, blobContainerName);
        EventProcessorClient processor = new EventProcessorClient(storageClient, consumerGroup, ehubNamespaceConnectionString, eventHubName);

        processor.ProcessEventAsync += ProcessEvent.ProcessEventHandler;
        processor.ProcessErrorAsync += ProcessEvent.ProcessErrorHandler;

        await processor.StartProcessingAsync();
    }

ProcessorEventHandler 类:

public static class ProcessEvent
{
    public static async Task ProcessEventHandler(ProcessEventArgs eventArgs)
    {
        var result = Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray());

        //DO STUFF
        await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken);
    }

    public static Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs)
    {
        //DO STUFF
        return Task.CompletedTask;
    }
}

这段代码可以工作,但我的问题是:这样实现可以吗?如果消费者不停歇,会有问题吗?它可以阻止我的代码中的其他任务(或请求)吗?

是否有更好的方法在.Net Core中使用依赖注入(inject)来实现它?

我找不到任何在 WebApi 中实现的示例,这有什么原因吗?

最佳答案

正如 Jesse Squire 提到的,WebAPI 不一定是正确的实现方法,但它主要取决于您的目标是什么。

如果您正在制作还包含事件中心监听器的 API,则应在 IHostedService interface 下实现它。 。您现有的AddPropostaEventHub()方法进入接口(interface)的StartAsync(CancellationToken cancellationToken)内部这是 .NET Core 用于启动后台任务的方法。然后,在 Startup.cs 中,将处理程序注册为 services.AddHostedService<EventHubService>(); 。这可确保长时间运行的监听器得到正确处理,而不会阻止传入的 HTTP 请求。

如果您还没有涉及 API 或能够完全拆分流程,那么您应该考虑将其创建为控制台应用程序而不是托管服务,这进一步分离了 API 和事件监听器的角色。

您没有提到要在哪里部署它,但如果您碰巧要部署到 Azure 应用服务,您确实有一些选项可以将接收器与 API 分开,在这种情况下,我绝对建议您这样做所以。在应用程序服务内部,有一个名为 WebJobs 的功能。它专门用于处理此类事情,而不使其成为 API 的一部分。一个不错的选择是 Functions 。在这种情况下,您根本不必担心为事件中心设置 DI,主机进程会为您处理这件事。

关于c# - Azure 事件中心 - 如何在 .Net Core WebAPI 中实现使用者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63705977/

相关文章:

asp.net-mvc-3 - 在 Azure 网站上使用 GData API 时出现 InvalidCredentialsException;本地调试运行正常

c# - 如何维护 3 个网站之间的语言?

c# - 如何确定是什么正在重置我的连接?

c# - 如果两者都存在,如何调用Foo(此对象o)而不是Foo(此T t)?

C# Datepicker 值未保存在 MySql 数据库中

c# - MongoDB全文搜索

azure - 我可以使用 Azure Oauth 应用程序的 client_id 和 client_secret 获取用户配置文件吗?

json - Azure IoT 中心中的消息路由返回 application/octet-stream

c# - 为什么三元运算符和 if 语句返回不同的结果?

c# - Int 数组作为字典中的键 VS 字符串