Итак, у меня есть модуль 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, поэтому любые указатели в правильном направлении будут с благодарностью.