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

22

我有如下代码:

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

3
从技术角度来看,服务器应该接受带引号的边界参数。不过很高兴你已经找到了解决方法。http://tools.ietf.org/html/rfc2046#section-5.1.1 - Darrel Miller
2个回答

43

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

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

非常聪明的人,你让我开心了!干净利落的解决方案,问题陈述也讲解得很清楚。 - Malik Khalil

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接