У меня микросервис на основе .NET Core 2.2.Я использую RawRabbit (версия 2.0.0-бета9) в качестве служебной шины.Следующие пакеты были установлены вместе с ним:
<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);
Исключение, которое я получаю:
MissingMethodException: метод не найден: 'Void Newtonsoft.Json.JsonSerializer.set_TypeNameAssemblyFormat (System.Runtime.Serialization.Formatters.FormatterAssemblyStyle)'.RawRabbit.DependencyInjection.RawRabbitDependencyRegisterExtension + <> c.b__0_1 (распознаватель IDependencyResolver)
....... больше текста .......
RawRabbit.BusClient.InvokeAsync (действие pipeCfg, Действие contextCfg, CancellationToken token) Actio.Api.Controllers.ActivitiesController.Post (модель CreateActivity) в ActivitiesController.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.Этот код, кажется, хорошо работает для них с теми же пакетами.