使用 MultipartFormDataContent 生成的错误 Content-Type 标头

Posted

技术标签:

【中文标题】使用 MultipartFormDataContent 生成的错误 Content-Type 标头【英文标题】:Wrong Content-Type header generated using MultipartFormDataContent 【发布时间】:2014-03-01 10:37:15 【问题描述】:

我有以下代码:

private static string boundary = "----CustomBoundary" + DateTime.Now.Ticks.ToString("x");

private static async Task<string> PostTest()

    string servResp = "";

    using (var content = new MultipartFormDataContent(boundary))
    
        content.Add(new StringContent("105212"), "case-id");
        content.Add(new StringContent("1/14/2014"), "dateFrom");
        content.Add(new StringContent("1/15/2014"), "dateTo");

        HttpClientHandler handler = new HttpClientHandler();
        cookieContainer = new CookieContainer();
        handler.CookieContainer = cookieContainer;

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://somewebsite.com/form");
        request.Headers.ExpectContinue = false;
        request.Content = content;

        httpClient = new HttpClient(handler);

        HttpResponseMessage response = await httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();

        servResp = await response.Content.ReadAsStringAsync();
    

    return servResp;

当我运行它时,我在 Fiddler 中看到了 Content-Type 标头:

Content-Type: multipart/form-data; boundary="----CustomBoundary8d0f01e6b3b5daf"

因为边界值是用引号引起来的,服务器会忽略请求体。如果我删除引号并在 Fiddler Composer 中运行请求,则请求正在正确处理。

我尝试添加内容标题:

//request.Content.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
//request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data; boundary=" + boundary);

...但它不起作用,错误消息是:“无法添加值,因为标头'Content-Type'不支持多个值。”和“值'multipart/form-data,boundary=----CustomBoundary8d0f024297b32d5'的格式无效。”,对应。

如何在请求中添加正确的 Content-Type 标头,以便边界值不会用引号括起来?

Content-Type: multipart/form-data; boundary=----CustomBoundary8d0f01e6b3b5daf

【问题讨论】:

从技术上讲,服务器应该接受引用的边界参数。 tools.ietf.org/html/rfc2046#section-5.1.1 很高兴你找到了解决方法。 【参考方案1】:

正如 Darrel Miller 在 RFC 中指出的: (我在这里找到) https://datatracker.ietf.org/doc/html/rfc2046#section-5.1.1

引号通常不是必需的。但如果边界值在标头值中有非法字符,则可能是必需的。 (例如,冒号、逗号、空格、...)

非法:

Content-Type: multipart/form-data, boundary=abc:def

法律:

Content-Type: multipart/form-data, boundary="abc:def"

带有前导和最终尾随双连字符的多部分标记不得包含引号:

非法:

--"abc:def"

法律:

--abc:def

【讨论】:

【参考方案2】:

通过从 MultipartFormDataContent 中删除标头并重新添加而不进行验证来解决此问题:

content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);

【讨论】:

非常聪明的人,你成就了我的一天!带有解释清楚的问题陈述的干净解决方案。

以上是关于使用 MultipartFormDataContent 生成的错误 Content-Type 标头的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)