使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)