У меня есть приложение .Net Core 2.0, которое отправляет файлы на конечную точку Web API с использованием многокомпонентного контента.Куда бы я ни посмотрел, например, C # HttpClient 4.5 multipart / form-data upload , создается впечатление, что это должно быть так же просто, как передать FileStream в StreamContent.Однако, когда я пишу сообщение, файл выглядит как текст, а не биты.
Фактический код:
var request = new HttpRequestMessage()
{
Method = HttpMethod.Post,
RequestUri = new Uri( "http://localhost:10442/filetest" )
};
var multiContent = new MultipartFormDataContent();
var filestream = File.OpenRead( path );
var filename = Path.GetFileName( path );
var streamContent = new StreamContent( filestream );
streamContent.Headers.Add( "Content-Type", "application/octet-stream" );
streamContent.Headers.Add( "Content-Disposition", $"form-data; name=\"file1\"; filename=\"{filename}\"" );
multiContent.Add( streamContent, "file", filename );
request.Content = multiContent;
var response = await new HttpClient().SendAsync( request );
Запрос выглядит так, что, как вы можете заметить,, не все в одной строке (что я считаю проблемой):
POST http://localhost:10442/filetest HTTP/1.1
Content-Type: multipart/form-data; boundary="c5295887-425d-4ec7-8638-20c6254f9e4b"
Content-Length: 88699
Host: localhost:10442
--c5295887-425d-4ec7-8638-20c6254f9e4b
Content-Type: application/octet-stream
Content-Disposition: form-data; name="file1"; filename="somepdf.pdf"
%PDF-1.7
%
1 0 obj
<</Type/Catalog/Version/1.7/Pages 3 0 R/Outlines 2 0 R/Names 8 0 R/Metadata 31 0 R>>
endobj
Fiddler показывает весь пост вплоть до конечной границы, но await Request.Content.ReadAsStringAsync()
в конечной точке показывает толькопервая пара дюжин байт (похоже, что поток не был завершен, но если Fiddler получил все это, разве моя конечная точка тоже не должна?)конечная точка;Я создал эту конечную точку для локального тестирования.
Исключение, которое я получаю: «Неожиданный конец многочастного потока MIME. Многочастное сообщение MIME не завершено».Для меня это имеет смысл как в том случае, если я действительно получаю только часть своего потока, так и в том случае, если разрывы строк сбрасывают что-то., это закрывает потоки, и я получаю исключения таким образом.
И для полноты, вот конечная точка, которую я называю:
public async void ReceiveFiles()
{
// exception happens here:
var mpData = await Request.Content.ReadAsMultipartAsync();
await Task.FromResult( 0 );
}