首页 > 解决方案 > .NET Core 服务启动配置

问题描述

我被指派升级一个由前同事建造的项目。我不是 .NET Core 专家,我理解其中的大部分内容与任何其他语言类似,但我无法理解启动时进行的 Fluent 配置。

在 Startup.cs 中,声明了这个函数:

 public void Configure(IApplicationBuilder app)

在某些时候,会初始化一个侦听某些内容的服务。我可以从已经初始化的类/服务中管理它,但我想了解这是什么:

app.UseRawRequestRequestBodyHandler(options => options
                .Handlers
                .AddRange(new[] {
                    new RawRequestHandler
                    {
                        ContentType = NotificationSubscriber.ContentType,
                        StartSegments = NotificationSubscriber.StartSegments,
                        Response = "[OK]",
                        Endpoint = new Uri(_configManager.Client.BaseAddress, "v1/payments").ToString(),
                        ModifyRequestBodyAsyncFunc = async (handler, context, bodyContent) =>
                        {
                            using (var scope = app.ApplicationServices.CreateScope())
                            {
                                var subscriber = scope.ServiceProvider
                                    .GetRequiredService<INotificationSubscriber>();
                                await subscriber.QueueAndAkcknowledgeAsync(handler, context, bodyContent);
                            }

                            return bodyContent;
                        }
                    },

我在使用 ModifyRequestBodyAsyncFunc 函数时遇到了特殊问题,该函数是这样声明的(在接口中):

 public Func<RawRequestHandler, HttpContext, string, Task<string>> ModifyRequestBodyAsyncFunc { set; get; }

另外,我不知道初始化处理程序、上下文和 bodyContent 的方式或位置(RawRequestHandler handler, HttpContext context, string bodyContent在 NotificationSubscriber 类中声明)。我认为这些是由依赖注入加载的,但对于我见过的其他 DI 实现来说会有所不同。

任何帮助,将不胜感激; 另外,我接受阅读建议。

非常感谢!

标签: asp.net-core.net-core

解决方案


我在使用 ModifyRequestBodyAsyncFunc 函数时遇到了特殊问题

这是一种特殊的 C# 类型,称为委托。有问题的委托是一个接受RawRequestHeader,并返回 a的函数HttpContext,它告诉我们它是异步的。stringTask<string>

接下来,这是创建匿名异步函数并将其分配给委托属性的语法:

/* SomeProp */ = async (handler, context, bodyContent) =>
{
    // ...
    return bodyContent;
}

另外,我不知道如何或在哪里初始化handlercontext并且bodyContent

.UseRawRequestRequestBodyHandler(...)寄存器 amiddleware基本上是为每个请求运行的一段代码。因此,在该中间件的某个地方,有代码可以访问所述参数并可能像这样传递它们:

// the params are not necessarily named exactly like this, only the types must match
string content = await rawRequestHeader.ModifyRequestBodyAsyncFunc(handler, context, bodyContent);

请注意await关键字(我们必须等待异步函数)以及委托像普通方法一样被调用的事实。


推荐阅读