Как отправить файл по API без await/async

133
14 сентября 2019, 05:50

Подскажите, возможно ли обойтись без асинхронных операций await/async в коде, для загрузки файла?

Для загрузки файла используется ресурс: https://anonfile.com/docs/api

Для работы с API ресурс предоставляет код:

curl -F "file=@test.txt" https://anonfile.com/?token=s245v7ebt3sn7kf5

Код curl конвертировал в C# на сервисе: https://curl.olsh.me/

Получил результат:

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://anonfile.com/?token=s245v7ebt3sn7kf5"))
    {
        var multipartContent = new MultipartFormDataContent();
        multipartContent.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), "file", Path.GetFileName("test.txt"));
        request.Content = multipartContent; 
        var response = await httpClient.SendAsync(request);
    }
}

Проблема в коде последняя строчка:

var response = await httpClient.SendAsync(request);

Когда я вставляю данный код в кнопку, приходится добавлять async и использовать версию NetFramework 4.5+

private async void button1_Click(object sender, EventArgs e)

Есть ли возможность избавиться от await/async, чтобы файл загрузился другим способом?

Answer 1

Держи хэлпер, помогающий безболезненно отреагировать на ответ

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void OnButtonClick(object sender, EventArgs e)
        {
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("POST"), 
                    "https://anonfile.com/?token=s245v7ebt3sn7kf5"))
                {
                    var multipartContent = new MultipartFormDataContent();
                    multipartContent.Add(
                        new ByteArrayContent(File.ReadAllBytes("test.txt")), "file", 
                        Path.GetFileName("test.txt"));
                    request.Content = multipartContent;
                    Helper.Send(request, task =>
                    {
                        if (task.Status == TaskStatus.RanToCompletion)
                        {
                            SetResult(task.Result.ToString());
                        }
                        else
                        {
                            SetResult("Что-то пошло не так");
                        }
                    }, httpClient);
                }
            }
        }
        private void SetResult(string text)
        {
            if (InvokeRequired)
            {
                Invoke(new Action(() => { SetResult(text); }));
            }
            else
            {
                Text = text;
            }
        }
    }
    public static class Helper
    {
        public static void Send(HttpRequestMessage request, Action<Task<HttpResponseMessage>> continueAction, HttpClient httpClient)
        {
            SendRequest(request, continueAction, httpClient);
        }
        private static void SendRequest(HttpRequestMessage request, Action<Task<HttpResponseMessage>> continueAction, HttpClient httpClient)
        {
            var task = httpClient.SendAsync(request);
            task.GetAwaiter().OnCompleted(() =>
            {
                continueAction(task);
            });
        }
    }
}
Answer 2

Можно как-то так обработать ответ асинхронно, чтобы не зависало окно.

    private void OnButtonClick(object sender, EventArgs e)
    {
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(
                new HttpMethod("POST"), "https://someserver.com/?token=s123"))
            {
                var multipartContent = new MultipartFormDataContent();
                multipartContent.Add(new ByteArrayContent(
                    File.ReadAllBytes("test.txt")), "file", Path.GetFileName("test.txt"));
                request.Content = multipartContent;
                httpClient.SendAsync(request).ContinueWith(task =>
                {
                    if (task.Status == TaskStatus.RanToCompletion)
                    {
                        //continuation(task.Result);
                    }
                    else
                    {
                        // ...
                        //continuation(null);
                    }
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
        }
    }
READ ALSO
Найти Label по Content и удалить его

Найти Label по Content и удалить его

Как программно можно найти дочерние элементы Label по их Content внутри Canvas и удалить их ? Создаются динамически и по ненадобности нужно удалять...

127
Element is not attached to the page document

Element is not attached to the page document

Помогите, пожалуйста, с решением проблемы element is not attached to the page documentРешил сделать програму по продаже карточек в Steam

166
Массив или база данных

Массив или база данных

Возможно ли организовать такой массив ? bitmap | string | int | int

117