带参数的HttpClient MultipartFormDataContent(C#)

时间:2016-07-26 10:31:22

标签: c# csv httpclient

我正在尝试将一个csv文件和参数发送到http API,并且正在努力调试出错的地方。

对于仅需要参数的POST请求(没有csv文件),我可以成功执行此操作:

    HttpContent upload = new FormUrlEncodedContent(new Dictionary<string, string> { { "name", "myName" }});
    HttpResponseMessage uploadResponse = await client.PostAsync("api/datasets", upload);

对于需要参数和csv文件的POST请求,我使用的是MultipartFormDataContent:

            var content = new MultipartFormDataContent();

            HttpContent upload = new FormUrlEncodedContent(new Dictionary<string, string> { { "name", "myName" }});            
            content.Add(upload);

            byte[] csvBytes = File.ReadAllBytes("myfile.csv");
            var csvContent = new ByteArrayContent(csvBytes);
            content.Add(csvContent, "csvfile", "datafile.csv");

            HttpResponseMessage uploadResponse = await client.PostAsync("api/datasets", content);

但是,服务器现在返回一条消息,说我没有指定“name”参数。我错过了什么?如何正确提交参数?

3 个答案:

答案 0 :(得分:0)

更改为

new Dictionary<string, string> { { "name", "myName" }}

new List<KeyValuePair<string, string>>({ "name", "myName" })

现在应该注意这个参数。

答案 1 :(得分:0)

在content.Add之前(csvContent,&#34; csvfile&#34;,&#34; datafile.csv&#34;); 添加以下行:

csvContent.Headers.Add("Content-Type", "text/csv");
csvContent.Headers.Add("Content-Disposition", "form-data; name=\"csvfile\"; filename=\"datafile.csv\"");

答案 2 :(得分:0)

这是我的猜测:

要包装一系列键/值对,应选择 application / x-www-form-urlencoded(FormUrlEncodedContent) multipart / form-data (MultipartFormDataContent)。如果同时使用两者,则将创建两个级别的框。

具体来说,您正在调用的API几乎肯定需要

  multipart/form-data
    subpart with name "parameter1" value "value1"
    subpart with name "parameter2" value "value2"
    subpart with name "csvfile" value <contents of datafile.csv>

但是你在给它

  multipart/form-data
    subpart with no name, value "parameter1=value1&parameter2=value2", content-type x-www-form-urlencoded
    subpart with name "csvfile" value <contents of datafile.csv>

有关返回表单数据的两种方式的更完整说明,请参见What does enctype='multipart/form-data' mean?