#asp.net-core-2.2 #rawrabbit
#asp.net-core-2.2 #rawrabbit
Вопрос:
У меня есть микросервис, основанный на .NET Core 2.2. Я использую RawRabbit (версия 2.0.0-beta9) в качестве служебной шины. С ним были установлены следующие пакеты:
<PackageReference Include="RawRabbit" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.DependencyInjection.ServiceCollection" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.Operations.Publish" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.Operations.Subscribe" Version="2.0.0-beta9" />
Вот как выглядит мой контроллер:
private readonly IBusClient _busClient;
//...constructor that inits the _busClient
[HttpPost("")]
public async Task<IActionResult> Post([FromBody] CreateActivity model)
{
model.Id = Guid.NewGuid();
await _busClient.PublishAsync(model); //Exception thrown here
return Accepted($"Activities/{model.Name}");
}
Проблема возникает, когда код пытается выполнить следующее:
await _busClient.PublishAsync(model);
Исключение, которое я получаю, это:
Исключение MISSINGMETHOD: метод не найден: ‘Аннулирует Newtonsoft.Json.JsonSerializer.set_TypeNameAssemblyFormat (System.Runtime.Сериализация.Форматирование.FormatterAssemblyStyle)’. RawRabbit.DependencyInjection.RawRabbitDependencyRegisterExtension <>c.b__0_1 (распознаватель IDependencyResolver)
……. больше текста …….
RawRabbit.BusClient.InvokeAsync (Action pipeCfg, Action contextCfg, токен CancellationToken) Actio.Api.Controllers.Activitescontroller.Опубликовать (модель CreateActivity) в activitescontroller.cs
далее следует код моего действия Post, как показано выше.
Следующее действие работает так, как ожидалось:
[HttpGet]
public IActionResult Get()
{
return Content("Hello from Actio API!");
}
Я предположил, что это потому, что это действие не использует IBusClient
. Итак, проблема должна была быть с RawRabbit. Я погуглил проблему и обнаружил проблему в репозитории RawRabbit GitHub. Решением было обновление до более новой версии на RawRabbit. Итак, я попытался выполнить обновление до 2.0.0-rc1
, но я получил некоторые синтаксические ошибки. Я определил класс Extensions
, который определяет следующий метод:
public static Task WithCommandHandlerAsync<TCommand>(this IBusClient bus,
ICommandHandler<TCommand> handler) where TCommand: ICommand
=> bus.SubscribeAsync<TCommand>(msg => handler.HandleAsync(msg),
ctx => ctx.UseConsumerConfiguration(cfg =>
cfg.FromDeclaredQueue(q => q.WithName(GetQueueName<TCommand>()))));
Проблема, похоже, в UseConsumerConfiguration
. Ошибка гласит:
Контекст ISubscribe не содержит определения для конфигурации UseConsumerConfiguration
Дополнительная информация: Я изучаю курс по .NET Microservices от Packt Publishing. Этот код, похоже, отлично работает для них с точно такими же пакетами.
Ответ №1:
Для всех, кто в будущем, вы должны выполнить следующее:
- RawRabbit 2.0.0-rc5 (последняя версия на момент написания). Включите предварительные версии.
- Измените конфигурацию UseConsumerConfiguration -> Конфигурацию UseSubscribeConfiguration
- Установите RawRabbit.Операции.Подписаться, потому что SubscribeAsync больше не будет распознаваться
Конечный результат должен выглядеть следующим образом:
public static Task WithCommandHandlerAsync<TCommand>(this IBusClient bus,
ICommandHandler<TCommand> handler) where TCommand : ICommand
=> bus.SubscribeAsync<TCommand>(msg => handler.HandleAsync(msg),
ctx => ctx.UseSubscribeConfiguration(cfg =>
cfg.FromDeclaredQueue(q => q.WithName(GetQueueName<TCommand>()))));
Комментарии:
1. У меня это сработало, обновив все пакеты RawRabbit в действии. Установите Common.csproj на последнюю версию (2.0.0-rc5) и выполните шаги 2 и 3.
Ответ №2:
Обновите версию RawRabbit до 2.0.0-rc5
После этого используйте UseSubscribeConfiguration вместо UseConsumerConfiguration
Комментарии:
1. Я тоже пробовал это, но это не сработало. Вы пробовали это и заставили это работать?