Mico.Demo/MassTransit示例代码/MassTransitDemo.Publisher/Controllers/MessageController.cs

229 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MassTransit;
using Microsoft.AspNetCore.Mvc;
using MassTransitDemo.Contracts;
namespace MassTransitDemo.Publisher.Controllers;
/// <summary>
/// 消息发布控制器
/// 提供发布/订阅模式和请求/响应模式的API接口
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class MessageController : ControllerBase
{
private readonly IPublishEndpoint _publishEndpoint;
private readonly IRequestClient<RequestMessage> _requestClient;
private readonly ILogger<MessageController> _logger;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="publishEndpoint">发布端点,用于发布/订阅模式</param>
/// <param name="requestClient">请求客户端,用于请求/响应模式</param>
/// <param name="logger">日志记录器</param>
public MessageController(
IPublishEndpoint publishEndpoint,
IRequestClient<RequestMessage> requestClient,
ILogger<MessageController> logger)
{
_publishEndpoint = publishEndpoint;
_requestClient = requestClient;
_logger = logger;
}
/// <summary>
/// 发布/订阅模式:发布一条广播消息
/// </summary>
/// <param name="request">消息发布请求</param>
/// <returns>操作结果</returns>
[HttpPost("publish")]
public async Task<IActionResult> PublishMessage([FromBody] PublishMessageRequest request)
{
try
{
_logger.LogInformation("开始发布消息,标题: {Title}", request.Title);
// 创建发布/订阅消息实例
var message = new PublishSubscribeMessage
{
MessageId = Guid.NewGuid(),
CreatedAt = DateTime.UtcNow,
Title = request.Title,
Content = request.Content,
Priority = request.Priority
};
// 使用MassTransit发布消息广播给所有订阅者
await _publishEndpoint.Publish(message);
_logger.LogInformation("消息发布成功MessageId: {MessageId}", message.MessageId);
return Ok(new PublishMessageResponse
{
Success = true,
MessageId = message.MessageId,
Message = "消息发布成功"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "消息发布失败");
return StatusCode(500, new ErrorResponse
{
Success = false,
Error = ex.Message
});
}
}
/// <summary>
/// 请求/响应模式:发送请求并等待响应
/// </summary>
/// <param name="request">请求内容</param>
/// <returns>响应结果</returns>
[HttpPost("request")]
public async Task<IActionResult> SendRequest([FromBody] SendRequestRequest request)
{
try
{
_logger.LogInformation("开始发送请求,操作: {Operation}", request.Operation);
// 创建请求消息实例
var requestMessage = new RequestMessage
{
RequestId = Guid.NewGuid(),
RequestedAt = DateTime.UtcNow,
Operation = request.Operation,
Parameters = request.Parameters
};
// 使用MassTransit发送请求并等待响应
var response = await _requestClient.GetResponse<ResponseMessage>(requestMessage);
_logger.LogInformation("请求处理完成RequestId: {RequestId}, 成功: {Success}",
requestMessage.RequestId, response.Message.Success);
return Ok(new RequestResponseResult
{
Success = true,
RequestId = requestMessage.RequestId,
Response = response.Message
});
}
catch (RequestTimeoutException)
{
_logger.LogError("请求超时");
return StatusCode(408, new ErrorResponse
{
Success = false,
Error = "请求超时"
});
}
catch (Exception ex)
{
_logger.LogError(ex, "请求处理失败");
return StatusCode(500, new ErrorResponse
{
Success = false,
Error = ex.Message
});
}
}
}
/// <summary>
/// 发布消息请求模型
/// </summary>
public class PublishMessageRequest
{
/// <summary>
/// 消息标题
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 消息内容
/// </summary>
public string Content { get; set; } = string.Empty;
/// <summary>
/// 消息优先级默认1
/// </summary>
public int Priority { get; set; } = 1;
}
/// <summary>
/// 发布消息响应模型
/// </summary>
public class PublishMessageResponse
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 消息唯一标识符
/// </summary>
public Guid MessageId { get; set; }
/// <summary>
/// 响应消息
/// </summary>
public string Message { get; set; } = string.Empty;
}
/// <summary>
/// 发送请求模型
/// </summary>
public class SendRequestRequest
{
/// <summary>
/// 操作类型
/// </summary>
public string Operation { get; set; } = string.Empty;
/// <summary>
/// 请求参数JSON格式字符串
/// </summary>
public string Parameters { get; set; } = string.Empty;
}
/// <summary>
/// 请求响应结果模型
/// </summary>
public class RequestResponseResult
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 请求唯一标识符
/// </summary>
public Guid RequestId { get; set; }
/// <summary>
/// 响应消息
/// </summary>
public ResponseMessage? Response { get; set; }
}
/// <summary>
/// 错误响应模型
/// </summary>
public class ErrorResponse
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string Error { get; set; } = string.Empty;
}