RequestTimeoutException в сценарии запроса / ответа

Попытка реализовать сценарий запроса / ответа с MassTransit.RabbitMQ версия 4.0.1.1378-developвеб-приложение ASP.NET Core 2 и консольный проект.NET Core 2.

Ниже приведен код, который создает клиент шины и запроса в моем приложении ASP.NET Core 2.0:

var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
    sbc.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    })
);
services.AddSingleton<IPublishEndpoint>(bus);
services.AddSingleton<IBusControl>(bus);
var requestTimeout = TimeSpan.FromSeconds(10);
var address = new Uri("rabbitmq://localhost/myqueue");
services.AddScoped<IRequestClient<SubmitOrder, OrderSubmitResult>>(ctx => new MessageRequestClient<SubmitOrder, OrderSubmitResult>(bus, address, requestTimeout));

Затем с помощью IRequestClient<SubmitOrder, OrderSubmitResult> это было введено в мой контроллер, я отправляю запрос, как показано ниже:

private readonly IRequestClient<SubmitOrder, OrderSubmitResult> _client;
public async Task<ActionResult> SendRequest(string id)
{
    var result = await _client.Request(new SubmitOrder());
    ...
}

Наконец, способы, которыми я пытался отправить ответ клиенту:

var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });
    cfg.ReceiveEndpoint(host, "myqueue", ep =>
    {
        ep.Handler<SubmitOrder>(context => context.RespondAsync(new OrderSubmitResult()));

        // async version
        //ep.Handler<SubmitOrder>(async context =>
        //{
        //  await context.RespondAsync(new OrderSubmitResult());
        //});

        // with a Consumer
        //ep.Consumer<SubmitOrderConsumer>();

        // with a single Consumer
        //ep.Instance(new SubmitOrderConsumer());
    });
});
bus.Start();

Я получаю запрос в моем автобусе и отправляю соответствующий ответ. Но я всегда получаю RequestTimeoutException на стороне клиента и ни один из вышеперечисленных подходов не сработал.

Обновить:

Код в порядке. Я забыл завести автобус (bus.start) на стороне клиента: /

@Chris: Спасибо за добавление полного рабочего образца за короткое время. Я предлагаю добавить services.AddSingleton<IBusControl>(bus); а затем изменить Startup.cs"s Configure метод ниже:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime, IBusControl bus)
{
    applicationLifetime.ApplicationStopping.Register(() => bus.Stop(TimeSpan.FromSeconds(10)));
....

Чтобы справиться с грациозным отключением.

1 ответ

Решение

Я построил пример, чтобы показать, как это сделать правильно, включая использование ASP.NET Core 2, как веб-приложения, так и консольного приложения.

https://github.com/MassTransit/Sample-DotNetCore-Request

Наслаждайтесь!

Другие вопросы по тегам