使用HttpClient将文件和字符串作为post参数发送HTTP请求

时间:2015-02-18 20:07:59

标签: c# .net windows-phone-8.1

您好我正在编写Windows Phone 8.1应用程序,在此应用程序中我需要向Sonic API服务器发送请求,该请求应包含access_id(字符串)格式(字符串)和input_file(mp3文件),我一直坚持将文件和字符串放在一个请求中:这是我尝试过的:

public async static Task<string> RequestSong(StorageFile mp3File, string responseFormat)
    {
        try
        {
            using (var webClient = new HttpClient())
            {
                using (var form = new MultipartFormDataContent())
                {
                    var mp3FileByteArray = await readBytesFromStorageFile(mp3File);
                    form.Add(new StringContent(ApiAccessId), "access_id");
                    form.Add(new StringContent(responseFormat), "format");
                    form.Add(new ByteArrayContent(mp3FileByteArray, 0, mp3FileByteArray.Count()), "input_file", mp3File.Name);

                    HttpResponseMessage responseMessage = await webClient.PostAsync(ApiAccessUrl, form);
                    //responseMessage.EnsureSuccessStatusCode();
                    string responseString = responseMessage.Content.ReadAsStringAsync().Result;
                    return responseString;
                }
            }
        }
        catch (Exception e)
        {
            //handle this 
        }

        return "";
    }

请求成功执行但是它说access_id丢失或错误,access_id用于访问sonic API并且每个用户都有一个唯一的,这我无法工作,因为参数access_id和format放在请求中错误的内容类型(只是猜测)。因为如果我把字符串放在formUrlEncodedContent中,它工作正常,但我无法使用FormUrlEncodedContent上传文件。

有什么方法可以在同一个请求中发送文件和字符串吗?

BTW它的System.NET.Http命名空间。

1 个答案:

答案 0 :(得分:1)

您的access_id应作为查询字符串参数发送到您的网址。

ApiAccessUrl += "?access_id=" + ApiAccessId;

删除以下行:

form.Add(new StringContent(ApiAccessId), "access_id");