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