Нужна помощь в реализации IHttpAsyncHandler на моих методах, чтобы сделать вызов API - PullRequest
0 голосов
/ 05 ноября 2019

Итак, у меня есть модуль DNN, который представляет собой просто квадратную коробку для перетаскивания файлов, которые затем изменяются, переименовываются, сохраняются локально и загружаются в контейнер BLOB-объектов Azure. Теперь мне нужно сделать вызов API (который я сделал сам), чтобы получить некоторую информацию из базы данных на основе DNN ID пользователя. Все методы, которые я нашел до сих пор для выполнения вызовов API, должны выполняться асинхронно, поэтому мне нужно изменить интерфейс, из которого происходит этот класс, с IHttpHandler на IHttpHandlerAsync.

Однако поиск помощи с IHttpHandlerAsync доказал довольнотрудно. Я довольно новичок в веб-разработке, поэтому прошу прощения за любые очевидные ошибки или недоразумения.

    public class FileUploader : IHttpAsyncHandler
{
    private async Task<int> GetDogAsync()
    {
        int currentUserDnnId = UserController.Instance.GetCurrentUserInfo().UserID;

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

        Dog serializedDog = new Dog
        {
            DogTableID = -1
        };
        using (var client = new HttpClient())
        {

            var content = await client.GetStringAsync("https://localhost:5566/api/dogs/getlatestdog/fromdnnid/" + currentUserDnnId);
            if (content != null)
            {
                serializedDog = (new JavaScriptSerializer().Deserialize<Dog>(content));
                return serializedDog.DogTableID;

            }
        }
        return serializedDog.DogTableID;

    }


    #region IHttpAsyncHandler Members



    private AsyncProcessorDelegate _Delegate;

    protected delegate void AsyncProcessorDelegate(HttpContext context);



    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        _Delegate = new AsyncProcessorDelegate(ProcessRequest);

        return _Delegate.BeginInvoke(context, cb, extraData);

    }



    public void EndProcessRequest(IAsyncResult result)

    {

        _Delegate.EndInvoke(result);

    }



    #endregion



    #region IHttpHandler Members



    public bool IsReusable

    {

        get { return true; }

    }



    public async void ProcessRequest(HttpContext context)

    {

        await UploadFile(context);

    }

    #endregion

public async Task UploadFile(HttpContext context)

{
  //file gets resized, renamed, saved and uploaded to Azure
  int serializedDogTableId = await GetDogAsync();

}

Метод UploadFile инициирует GetDogAsync () для хранения возвращенной информациив таблице.

Я получил образец для IHttpAsyncHandler здесь: https://madskristensen.net/blog/how-to-use-the-ihttpasynchandler-in-aspnet/

Но я не совсем уверен, как это реализовать? Как и сейчас, я получаю исключение «System.NullReferenceException:« Ссылка на объект не установлена ​​на экземпляр объекта. »При перетаскивании изображения в поле загрузки. Хотел бы я сказать вам точно , где это исключение происходит, но отладка трудна, потому что модуль может быть протестирован только на локальном веб-сайте DNN.

Я уверен, что япросто неправильно использовать интерфейс IHttpAsyncHandler, поэтому любые указатели в правильном направлении будут с благодарностью.

...