[英]HttpClient send XML PostAsync Malformed request: Premature end of file?
[英]How to make PostAsync request with HttpClient to send/upload CSV file?
我正在使用HttpClient進行PostAsync API調用以發送/上傳CSV文件。我在PHP中具有等效的代碼,效果很好。 但是,當我在C#中嘗試使用它時,狀態代碼為500的錯誤消息為“內部服務器錯誤”。下面是我嘗試過的C#代碼。
string apiUrl = "https://api.host/csv-upload/api-key?remove-hosts=false";
HttpClient client = new HttpClient();
//Prepare request header
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
client.DefaultRequestHeaders.Add("Api-Key", "xxxyyyzzz");
//cache
CacheControlHeaderValue cacheControl = new CacheControlHeaderValue();
cacheControl.NoCache = true;
client.DefaultRequestHeaders.CacheControl = cacheControl;
byte[] bytes = File.ReadAllBytes(csvFilePath); //c://Temp/test.csv
HttpContent fileContent = new ByteArrayContent(bytes);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");
MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(fileContent, "file", "test.csv");
try
{
string message = client.PostAsync(new Uri(apiUrl), content).ContinueWith(async responseTask =>
{
HttpResponseMessage response = await responseTask;
return response.Content.ReadAsStringAsync().ContinueWith(async contentTask =>
{
string contents = await contentTask;
return contents;
}).Result.Result;
}).Result.Result;
}
catch(Exception ex)
{
string message = ex.Message;
Console.WriteLine(message); ;
}
finally
{
Console.WriteLine("Error");
}
調用api時,我希望狀態代碼為202。
但是實際結果是"Internal server error"
。
可以正常工作的等效PHP代碼是:
function api_call($url, $api_key, $csv_file) {
$request = new \Http_Request2($url);
$request->setHeader(array(
'Api-Key' => $api_key,
'content-type' => 'application/x-www-form-urlencoded'
));
$request->setMethod(\HTTP_Request2::METHOD_POST);
$request->addUpload('file' , $csv_file , 'file' , 'text/csv');
$response = $request->send();
return $response->getBody();
}
試試下面的代碼
string apiUrl = "https://api.host/csv-upload/api-key?remove-hosts=false;
HttpClient client = new HttpClient();
//Prepare request header
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
client.DefaultRequestHeaders.Add("Api-Key", "xxxyyyzzz");
//cache
CacheControlHeaderValue cacheControl = new CacheControlHeaderValue();
cacheControl.NoCache = true;
client.DefaultRequestHeaders.CacheControl = cacheControl;
byte[] bytes = File.ReadAllBytes(csvFilePath); //c://Temp/test.csv
HttpContent fileContent = new ByteArrayContent(bytes);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");
try
{
var response = await httpClient.PostAsync(apiUrl , new MultipartFormDataContent
{
{fileContent, "\"file\"", "\"test.csv\""}
});
}
catch(Exception ex)
{
string message = ex.Message;
Console.WriteLine(message); ;
}
finally
{
Console.WriteLine("Error");
}`
或替換content.Add(fileContent,“ file”,“ test.csv”);
content.Add(fileContent,“ \\”文件\\“”,“ \\” test.csv \\“);
這適用於.net 4.5。
注意MultipartFormDataContent中的\\“。MultipartFormDataContent中有一個錯誤。
在4.5.1中,MultipartFormDataContent使用正確的引號包裝數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.