0

所以我有一个 DNN 模块,它基本上只是一个方框,用于放置文件,然后调整大小、重命名、在本地保存并上传到 Azure blob 容器。现在我需要做的是进行 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 接口,因此任何指向正确方向的指针都将不胜感激。

4

0 回答 0