You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Rebus Databus添加多个附件?

在Rebus DataBus中添加多个附件的解决方案

当然没问题!Rebus的DataBus完全支持给单条消息附加多个数据源,你写的代码思路是对的,只是还差最后把附件和消息关联起来的步骤。下面给你补全完整的实现方案:

1. 先定义包含附件引用的消息类

首先需要在你的消息类型里加两个属性,用来存储每个DataBus附件的唯一ID:

public class MessageWithTwoAttachments
{
    // 存储第一个附件的ID
    public string FirstAttachmentId { get; set; }
    // 存储第二个附件的ID
    public string SecondAttachmentId { get; set; }
    // 消息本身的业务内容
    public string BusinessContent { get; set; }
}

2. 补全你的附件添加方法

接下来完善你写的AddTwoDataBusAttachments方法,创建两个附件后把它们的ID绑定到消息的对应属性上:

private async Task AddTwoDataBusAttachments(Stream firstSource, Stream secondSource, MessageWithTwoAttachments message)
{
    // 用嵌套using确保两个流都能被正确释放
    using (firstSource)
    using (secondSource)
    {
        // 创建第一个DataBus附件
        var firstAttachment = await _bus.Advanced.DataBus.CreateAttachment(firstSource)
            .ConfigureAwait(false);
        // 创建第二个DataBus附件
        var secondAttachment = await _bus.Advanced.DataBus.CreateAttachment(secondSource)
            .ConfigureAwait(false);

        // 将两个附件的ID关联到消息属性
        message.FirstAttachmentId = firstAttachment.Id.ToString();
        message.SecondAttachmentId = secondAttachment.Id.ToString();

        // 这里可以直接发送消息(如果业务需要的话)
        await _bus.Send(message).ConfigureAwait(false);
    }
}

3. 接收消息时获取多个附件

当接收方处理这条消息时,就可以通过存储的ID分别取出两个附件:

public async Task Handle(MessageWithTwoAttachments message)
{
    // 获取并处理第一个附件
    using (var firstAttachmentStream = await _bus.Advanced.DataBus.OpenAttachment(Guid.Parse(message.FirstAttachmentId))
        .ConfigureAwait(false))
    {
        await SaveStreamToFile(firstAttachmentStream, "first_attachment_data.txt");
    }

    // 获取并处理第二个附件
    using (var secondAttachmentStream = await _bus.Advanced.DataBus.OpenAttachment(Guid.Parse(message.SecondAttachmentId))
        .ConfigureAwait(false))
    {
        await SaveStreamToFile(secondAttachmentStream, "second_attachment_data.txt");
    }
}

// 示例:把流保存到文件的辅助方法
private async Task SaveStreamToFile(Stream stream, string fileName)
{
    using (var fileStream = File.Create(fileName))
    {
        await stream.CopyToAsync(fileStream).ConfigureAwait(false);
    }
}

注意事项

  • 务必把每个流都包裹在using语句中,避免出现资源泄漏的问题。
  • 附件的ID是Guid类型,存储时可以转成字符串方便传输,接收时再解析回Guid即可。
  • 如果你的原始Message类没有对应属性存储附件ID,建议扩展该类或者创建新的消息类型,这更符合Rebus的使用规范。

内容的提问来源于stack exchange,提问作者Khaine775

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:22