gpt4 book ai didi

c# - MassTransit saga/statemachine 未将请求响应返回给 Controller

转载 作者:行者123 更新时间:2023-11-30 23:00:25 24 4
gpt4 key购买 nike

我觉得我已经很接近完成这项工作了,但似乎无法完成...

我有一个带有传奇/状态机的 .NET Core ASP 应用程序,它似乎在大多数情况下都运行良好。它:

  1. 收到请求
  2. 发布一个由传送名单拾取的事件
  3. 当传送名单完成时,它会发布一个事件
  4. 事件拾起 saga
  5. 然后 saga 向请求/响应消费者发送请求
  6. 响应回到传奇
  7. 但是然后我使用 RespondAsync 尝试将响应发送回原始调用 Controller ,但遗憾的是什么都没有返回

我的 Controller 看起来像:

private readonly IRequestClient<IRequestLink, IRequestLinkCompleted> _client;

public async Task<IActionResult> CreateLinkAsync([FromBody]CreateLinkRequest request)
{
var requestLink = new RequestLink {

GroupName = $"{request.Name} Group",
Name = request.Name,
LinkId = Guid.NewGuid()
};

var result = await _client.Request(requestLink).ConfigureAwait(false);

return Ok();
}

我的故事的精简版如下:

Request(() => LinkRequest, x => x.RequestId, cfg =>
{
cfg.ServiceAddress = new Uri($"rabbitmq://localhost/request_end_point_name");
cfg.SchedulingServiceAddress = new Uri($"rabbitmq://localhost/request_end_point_name");
cfg.Timeout = TimeSpan.FromSeconds(30);
});


During(RequestReceived,
When(LinkCreatedEvent)
.Request(LinkRequest, context => new SelectUrlByPublicId(context.Data.DatabaseId, context.Data.LinkId))
.TransitionTo(LinkRequest.Pending));

During(LinkRequest.Pending,
When(LinkRequest.Completed)
.ThenAsync(context => context.RespondAsync(new RequestLinkCompleted
{
CorrelationId = LinkRequest.GetRequestId(context.Instance),
DatabaseId = context.Data.DatabaseId
}))
.Finalize());

最后,在我的启动代码中,我这样配置请求/响应:

services.AddScoped<IRequestClient<IRequestLink, IRequestLinkCompleted>>(x => new MessageRequestClient<IRequestLink, IRequestLinkCompleted>(_bus, new Uri($"{messageBusSettings.Host}/create_link_saga"), TimeSpan.FromSeconds(30)));

我猜测 RespondAsync 调用没有使用正确/原始的 requestId,但我不知道如何检查或更改它。谁能帮忙?

最佳答案

由于丢失了原始请求的上下文,您需要自己完成 RespondAsync 中所做的事情。

  1. 从请求消息上下文中保存ResponseAddress
  2. 保存来自相同上下文的RequestId

在您的 saga 中,当需要响应时,您需要使用 context.GetSendEndpoint(context.Instance.SavedResponseAddress) 然后调用 Send 设置 委托(delegate)中的 RequestId 以匹配原始上下文中保存的 RequestId。

现在,您可能需要将这些保存在路由选择变量中,因为您的 saga 没有获得命令,只有后续事件,但最终效果是相同的,原始请求消息已经消失并且从未被 saga 看到.

关于c# - MassTransit saga/statemachine 未将请求响应返回给 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51589028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com