Господа, ситуация следующая:
я пытаюсь отправить запрос на поиск данных из одного микросервиса в другой и ожидать от него ответ, но по итогу выдает сообщение о превышенным временем ожидания, вроде код правильный но в чем проблема понять не могу
микросервис поиска
startrup
services.AddMassTransit(x =>
{
x.AddRequestClient<SearchRequest>();
x.UsingRabbitMq((context, cfg) =>
{
var rabbitMqConfig = Configuration.GetSection("RabbitMQ");
cfg.Host(rabbitMqConfig["Hostname"], h =>
{
h.Username(rabbitMqConfig["Username"]);
h.Password(rabbitMqConfig["Password"]);
});
cfg.ConfigureEndpoints(context);
});
});
appsetings.json
"RabbitMQ": {
"Hostname": "rabbitmq://localhost",
"Username": "guest",
"Password": "guest"
},
SearchServices
public class SearchRequest
{
public string Text { get; set; }
}
public class SearchResponse
{
public List<object> Data { get; set; }
}
public class SearchServices
{
private readonly IRequestClient<SearchRequest> _requestClient;
public SearchServices(IRequestClient<SearchRequest> requestClient)
{
_requestClient = requestClient;
}
public async Task<List<object>> SearchAsync(string text)
{
var searchRequest = new SearchRequest
{
Text = text
};
Log.Information("Отправка запроса на поиск: {Text}", searchRequest.Text);
var response = await _requestClient.GetResponse<SearchResponse>(searchRequest);
Log.Information("Получен ответ на запрос поиска");
var searchResponse = response.Message;
return searchResponse.Data;
}
}
controller
public class SearchController : ControllerBase
{
private readonly SearchServices _searchService;
private readonly ILogger<SearchController> _logger;
public SearchController(SearchServices searchService, ILogger<SearchController> logger)
{
_searchService = searchService;
_logger = logger;
}
[HttpPost("search")]
public async Task<IActionResult> SearchAsync(string text)
{
_logger.LogInformation("Получен запрос на поиск");
var searchResults = await _searchService.SearchAsync(text);
if (searchResults.Count == 0)
{
_logger.LogInformation("Результаты поиска не найдены");
return BadRequest(new { message = "Пользователи или товары не найдены" });
}
_logger.LogInformation("Возвращены результаты поиска для текста");
return Ok(searchResults);
}
}
микросервис пользователей
startup
services.AddMassTransit(config =>
{
config.AddConsumer<SearchRequestHandler>();
config.UsingRabbitMq((context, cfg) =>
{
var rabbitMqConfig = Configuration.GetSection("RabbitMQ");
cfg.Host(new Uri(rabbitMqConfig["Hostname"]), h =>
{
h.Username(rabbitMqConfig["Username"]);
h.Password(rabbitMqConfig["Password"]);
});
cfg.ConfigureEndpoints(context);
});
});
SearchRequestHandler
public class SearchRequest
{
public string Text { get; set; }
}
public class SearchResponse
{
public List<object> Data { get; set; }
}
public class SearchRequestHandler : IConsumer<SearchRequest>
{
private readonly AddDbContext _dbContext;
private readonly ILogger<SearchRequestHandler> _logger;
public SearchRequestHandler(AddDbContext dbContext, ILogger<SearchRequestHandler> logger)
{
_dbContext = dbContext;
_logger = logger;
}
public async Task Consume(ConsumeContext<SearchRequest> context)
{
var searchRequest = context.Message;
_logger.LogInformation("Получен запрос на поиск: {Text}", searchRequest.Text);
var searchResult = await PerformSearch(searchRequest.Text);
_logger.LogInformation("Поиск завершен. Найдено {Count} результатов", searchResult.Count);
var searchResponse = new SearchResponse { Data = searchResult };
await context.RespondAsync(searchResponse);
}
private async Task<List<object>> PerformSearch(string searchText)
{
var users = await _dbContext.Users
.Where(p => p.Username.Contains(searchText, StringComparison.OrdinalIgnoreCase))
.ToListAsync();
var results = users.Select(p => new { p.Username }).Cast<object>().ToList();
return results;
}
}
При запуске проекта регаются 2 обменника и 1 очередь
после отправки запроса появляются еще 2 обменника и 1 очередь
Как я полагаю, второй обменник созданный после отправки запроса должен привязываться к очереди чтобы отправить запрос, т.к. судя по логам
spoiler
(SearchService)
Request starting HTTP/2 POST
https://localhost:44327/search?text=sas - 0
[INF] Executing endpoint 'SearchService.Controllers.SearchController.SearchAsync
[INF] Route matched with {action = "Search", controller = "Search"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] SearchAsync(System.String) on controller SearchService.Controllers.SearchController
2023-08-09 21:18:22.136 +04:00 [INF] Получен запрос на поиск
2023-08-09 21:18:22.138 +04:00 [INF] Отправка запроса на поиск: sas
[INF] Executed action SearchService.Controllers.SearchController.SearchAsync
[INF] Executed endpoint 'SearchService.Controllers.SearchController.SearchAsync
[ERR] An unhandled exception has occurred while executing the request.
отправка запроса
идет но до микросервиса не доходит, подскажите в чем дело а то я уже без понятия