Я пытаюсь интегрировать использование внешнего API для выполнения вызовов POST и GET с моим клиентским приложением C # WPF. https://developers.virustotal.com/reference.
У меня есть следующие коды:
InfoProcessor.xaml.cs
public static async Task<InfoModel> LoadInfo(string infoVar)
{
string apiKey = "xxxxxxxxxxxxx";
//string resourceKey = "efbb7149e39e70c84fe72c6fe8cef5d379fe37e7238d19a8a4536fb2a3146aed";
string resourceKey = infoVar;
string url = $"https://www.virustotal.com/vtapi/v2/file/report?apikey={apiKey}&resource={resourceKey}";
//await Task.Delay(30000);
using (HttpResponseMessage response = await ApiStartup.ApiClient.GetAsync(url))
{
if (response.IsSuccessStatusCode)
{
InfoModel info = await response.Content.ReadAsAsync<InfoModel>();
return info;
}
else
{
throw new Exception(response.ReasonPhrase);
}
}
}
public static async Task<InfoModel> PostFileInfo(string filePath)
{
string url = "https://www.virustotal.com/vtapi/v2/file/scan";
ApiStartup.ApiClient.DefaultRequestHeaders.Add("User-Agent", "VT API Service");
using (var content = new MultipartFormDataContent())
{
var path = filePath;
string assetName = Path.GetFileName(path);
FileStream fs = File.OpenRead(path);
var streamContent = new StreamContent(fs);
streamContent.Headers.Add("Content-Type", "application/octet-stream");
streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(path) + "\"");
content.Add(streamContent, "file", Path.GetFileName(path));
content.Add(CreateApiPart());
//content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
Task<HttpResponseMessage> message = ApiStartup.ApiClient.PostAsync(url, content);
InfoModel info = await message.Result.Content.ReadAsAsync<InfoModel>();
return info;
}
}
ScanPage.xaml.cs
string filePath;
private void browseFileButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.Filter = "All files (*.*)|*.*";
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (openFileDialog.ShowDialog() == true)
{
filePath = openFileDialog.FileName;
fileLocation.Text = filePath;
}
}
private async void uploadFileButton_Click(object sender, RoutedEventArgs e)
{
if (filePath != null)
{
//await InfoProcessor.PostFileInfo(filePath, "https://www.virustotal.com/vtapi/v2/url/scan",);
responseText.Text = "File queued for scanning, please wait a moment...";
//var resultInfo = await InfoProcessor.PostInfo(filePath);
var resultInfo = await InfoProcessor.PostFileInfo(filePath);
await Task.Delay(60000);
var resultInfo2 = await InfoProcessor.LoadInfo(resultInfo.Resource);
//await Task.Delay(30000);
responseText.Text = $"Scan Completed, MD5 checksum of file is {resultInfo2.Sha256} \n {resultInfo2.Positives} out of {resultInfo2.Total} {resultInfo2.Permalink} scan engines has detected to be potentially malicious";
}
else
{
MessageBox.Show("please upload a file");
}
}
После выбора и загрузки файла файл будет загружен и отсканирован с помощью функции PostFileInfo, содержимое ответа: resource
id будет вставлено в функцию LoadInfo
в качестве аргумента. ,
Когда файл сканируется, остальная часть содержимого ответа, например значения md5 / sha256 / sha1, которые должны были быть загружены, будет пустой до завершения сканирования, , что означает, что я будунеобходимо реализовать функцию Task.Delay между функциями PostFileInfo и LoadInfo.
Однако даже после задержки в 60 секунд между функциями результаты не отображаются в responseText.Text доя называю это второй раз через некоторое время. Правильно ли я реализую функцию Task.Delay?