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

如何在C#中使用MimeKit解析HttpResponseMessage中的MIME消息

正确解析MIME多部分响应的方法

你的核心问题是没有正确提取包含boundary参数的完整ContentType,而且修改boundary的时机错误——必须在加载MIME实体前就把boundary配置好,否则MimeKit无法正确拆分多部分内容。

修正步骤及代码:

  1. 从响应头中获取完整的ContentType字符串(包含boundary参数),而不是只解析MediaType部分;
  2. 读取响应的原始字节流,避免编码转换损坏MIME结构;
  3. 用正确配置好的ContentType加载MIME实体,再遍历各部分。
using (var client = new HttpClient(handler))
{
    var mime = new MultipartFormDataContent("myBoundary");
    var attachment = new StringContent(envelope);
    // 添加attachment的头部...
    mime.Add(attachment);

    var response = await client.PostAsync("/endpoint", mime);
    response.EnsureSuccessStatusCode(); // 确保请求成功

    // 1. 获取完整的ContentType(包含boundary参数)
    var contentTypeStr = response.Content.Headers.ContentType.ToString();
    var contentType = ContentType.Parse(contentTypeStr);

    // 2. 读取原始字节流
    using (var ms = new MemoryStream(await response.Content.ReadAsByteArrayAsync()))
    {
        // 3. 加载MIME实体
        var multipart = MimeEntity.Load(contentType, ms) as Multipart;

        if (multipart != null)
        {
            // 遍历所有MIME部分
            foreach (var part in multipart)
            {
                if (part is MimePart mimePart)
                {
                    Console.WriteLine($"Content-Id: {mimePart.ContentId}");
                    Console.WriteLine($"Content-Type: {mimePart.ContentType}");

                    // 解码内容到内存流
                    using (var attachmentMs = new MemoryStream())
                    {
                        mimePart.Content.DecodeTo(attachmentMs);
                        attachmentMs.Position = 0;
                        // 这里可以处理attachmentMs中的内容,比如读取二进制数据或文本
                    }
                }
                else if (part is TextPart textPart)
                {
                    // 处理XML根部分
                    var xmlContent = textPart.Text;
                    Console.WriteLine("XML内容:");
                    Console.WriteLine(xmlContent);
                }
            }
        }
    }
}

关键说明:

  • 之前的错误:ContentType.Parse(response.Content.Headers.ContentType!.MediaType)只解析了multipart/related,丢失了boundary=MIME-Multipart-Boundary参数,导致MimeKit无法识别拆分边界;
  • 必须确保在MimeEntity.Load之前,ContentType已经包含正确的boundary,否则加载后的Multipart会是空的;
  • 使用ReadAsByteArrayAsync读取原始字节,避免ReadAsStringAsync的编码转换破坏MIME消息的二进制结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:55:30