Asp.net mvc 已跳过MassTransit中的队列,该队列在dot net核心应用程序中使用RabbitMQ

Asp.net mvc 已跳过MassTransit中的队列,该队列在dot net核心应用程序中使用RabbitMQ,asp.net-mvc,.net-core,rabbitmq,masstransit,Asp.net Mvc,.net Core,Rabbitmq,Masstransit,我有三个项目。一个是dotnet核心MVC,两个是API项目。MVC正在调用一个API以获取用户详细信息。当询问用户详细信息时,我通过MassTransit向队列发送消息。我正在排队。第三个项目是API项目,其中有一个消费者 我尝试为一个具有相同配置的演示制作另一个解决方案。它运转良好 下面是MVC Razor页面代码 public async Task<IActionResult> OnPostAsync(string returnUrl = null) {

我有三个项目。一个是dotnet核心MVC,两个是API项目。MVC正在调用一个API以获取用户详细信息。当询问用户详细信息时,我通过MassTransit向队列发送消息。我正在排队。第三个项目是API项目,其中有一个消费者

我尝试为一个具有相同配置的演示制作另一个解决方案。它运转良好

下面是MVC Razor页面代码

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        ReturnUrl = returnUrl;

        if (ModelState.IsValid)
        {
            var user = await AuthenticateUser(Input.Email);

            if (user == null)
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return Page();
            }

            #region snippet1
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, user.Email),
                new Claim("FullName", user.FullName),
                new Claim(ClaimTypes.Role, "Administrator"),
            };

            var claimsIdentity = new ClaimsIdentity(
                claims, CookieAuthenticationDefaults.AuthenticationScheme);

            var authProperties = new AuthenticationProperties
            {
                ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(15),
                IsPersistent = true,
            };

            await HttpContext.SignInAsync(
                CookieAuthenticationDefaults.AuthenticationScheme,
                new ClaimsPrincipal(claimsIdentity),
                authProperties);
            #endregion

            _logger.LogInformation("User {Email} logged in at {Time}.",
                user.Email, DateTime.UtcNow);

            return LocalRedirect(Url.GetLocalUrl(returnUrl));
        }

        return Page();
    }

    private async Task<ApplicationUser> AuthenticateUser(string email)
    {
        if (!string.IsNullOrEmpty(email))
        {
            using (var client = new System.Net.Http.HttpClient())
            {
                var request = new System.Net.Http.HttpRequestMessage();
                request.RequestUri = new Uri("http://localhost:52043/api/user?uName=" + email); // ASP.NET 3 (VS 2019 only)
                var response = await client.SendAsync(request);
                var customer = Newtonsoft.Json.JsonConvert.DeserializeObject<Customers>(response.Content.ReadAsStringAsync().Result);

                
                return new ApplicationUser()
                {
                    Email = email,
                    FullName = customer.FullName
                };
            }
        }
        else
        {
            return null;
        }
    }
用户API代码-52043:

[HttpGet]
    public async Task<IActionResult> Get(string uName)
    {
        var customer = _userRepository.GetCustomerByUserName(uName);

        Uri uri = new Uri("rabbitmq://localhost/loginqueue");
        var endpoint = await _bus.GetSendEndpoint(uri);
        await endpoint.Send(new LoginObj() { NoteString = customer.FullName + " has logged in at " + DateTime.Now.ToString() });
        
        return Json(customer);
    }
[HttpGet]
公共异步任务Get(字符串uName)
{
var customer=\u userRepository.GetCustomerByUserName(uName);
Uri=新的Uri(“rabbitmq://localhost/loginqueue");
var endpoint=wait_bus.GetSendEndpoint(uri);
wait endpoint.Send(new LoginObj(){NoteString=customer.FullName+”已在“+DateTime.Now.ToString()}”登录);
返回Json(客户);
}
日志API-使用者代码:

public class LoginConsumer : IConsumer<LoginObj>
{
    private readonly ILogger<object> _logger;

    public LoginConsumer(ILogger<object> logger)
    {
        _logger = logger;
    }

    public async Task Consume(ConsumeContext<LoginObj> context)
    {
        var data = context.Message;
        _logger.LogInformation(data.ToString());
    }
}
公共类登录消费者:IConsumer
{
专用只读ILogger\u记录器;
公共登录消费者(ILogger记录器)
{
_记录器=记录器;
}
公共异步任务使用(使用上下文)
{
var data=context.Message;
_logger.LogInformation(data.ToString());
}
}
登录API启动:

services.AddMassTransit(x =>
        {
            x.AddConsumer<LoginConsumer>();

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                // configure health checks for this bus instance
                cfg.UseHealthCheck(provider);

                cfg.Host("rabbitmq://localhost");

                cfg.ReceiveEndpoint("loginqueue", ep =>
                {
                    ep.PrefetchCount = 16;
                    ep.UseMessageRetry(r => r.Interval(2, 100));

                    ep.ConfigureConsumer<LoginConsumer>(provider);
                });
            }));
        });

        services.AddMassTransitHostedService();
services.AddMassTransit(x=>
{
x、 AddConsumer();
x、 AddBus(provider=>Bus.Factory.CreateUsingRabbitMq(cfg=>
{
//为此总线实例配置运行状况检查
cfg.UseHealthCheck(提供者);
主机(“rabbitmq://localhost");
接收端点(“登录”,ep=>
{
ep.PrefetchCount=16;
ep.UseMessageRetry(r=>r.Interval(2100));
ep.配置消费者(提供商);
});
}));
});
services.AddMassTransitHostedService();
根据:

MassTransit对消息约定使用完整的类型名,包括名称空间。在两个单独的项目中创建相同的消息类型时,名称空间必须匹配,否则消息将不会被使用

确保您的邮件类型在每个项目中具有相同的命名空间/类型。

根据:

MassTransit对消息约定使用完整的类型名,包括名称空间。在两个单独的项目中创建相同的消息类型时,名称空间必须匹配,否则消息将不会被使用


确保您的消息类型在每个项目中具有相同的命名空间/类型。

My controller位于
Users.API.controller
命名空间下,Consumer位于
Analytics.API
命名空间下。这就是您所指的吗?消息类型必须相同,包括命名空间。我的控制器位于
Users.API.controller
命名空间下,而消费者位于
Analytics.API
命名空间下。这就是您所指的吗?消息类型必须相同,包括名称空间。
services.AddMassTransit(x =>
        {
            x.AddConsumer<LoginConsumer>();

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                // configure health checks for this bus instance
                cfg.UseHealthCheck(provider);

                cfg.Host("rabbitmq://localhost");

                cfg.ReceiveEndpoint("loginqueue", ep =>
                {
                    ep.PrefetchCount = 16;
                    ep.UseMessageRetry(r => r.Interval(2, 100));

                    ep.ConfigureConsumer<LoginConsumer>(provider);
                });
            }));
        });

        services.AddMassTransitHostedService();