Вы прочитали весь файл в byte[]
и существует перегрузка GetFileReportAsync
, которая примет это, поэтому измените параметр с stream
на fileBytes
:
VirusTotalNet.Results.FileReport report = await virusTotal.GetFileReportAsync(fileBytes);
Дервиш Каймбашыоглу предложил сбросить позицию потока, но оказалось, что упомянутое местоположение было неправильным. Любой из них:
stream.Seek(0L, SeekOrigin.Begin);
// or
stream.Position = 0L;
Необходимо сделать непосредственно перед вызовом GetFileReportAsync
, после файла, который был прочитан, а не до. Это сработало бы.
Но подождите, есть еще!
Нет необходимости читать файл в fileBytes
, что означает, что нет необходимости сбрасывать должность. Поток может быть открыт и передан непосредственно в GetFileReportAsync
. Включая правильное удаление ресурсов, весь метод становится следующим:
[HttpGet]
public async Task<VirusTotalNet.Results.FileReport> ScanAsync(string file_id)
{
file_id = "./wwwroot/Upload/node-v12.14.1-x64.msi";
VirusTotal virusTotal = new VirusTotal("");
// virusTotal.UseTLS = true;
using (FileStream stream = System.IO.File.OpenRead(file_id))
{
VirusTotalNet.Results.FileReport report = await virusTotal.GetFileReportAsync(stream);
return report;
}
}
Это позволяет асинхронно читать как файл, так и сокет, и данные могут быть буферизованы в небольших количествах, так что большие файлы не будут не нужно загружать полностью в память.