WebAPI有条件地和异步地返回响应

本文关键字:返回 响应 异步 有条件 WebAPI | 更新日期: 2023-09-27 18:05:20

我有某种上传功能,它获取图像并将图像大小调整为不同的大小,然后将100x100图像的路径返回给用户。在我的例子中,用户要等到所有的调整大小和上传完成,这显然不利于用户体验。我试着让我的ActionResult作为一个异步任务,但我有麻烦。这是我现在的代码,它等待直到所有上传完成。

 [HttpPost]
    [Route("UploadProfileImage")]
    public async Task<IHttpActionResult> UploadProfileImage()
    {
        string userId= Identifier.GetIdentifier();
        ReturnResult response = new ReturnResult();
        try
        {
            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);
            var fileNameParam = provider.Contents[0].Headers.ContentDisposition.Parameters.FirstOrDefault(p => p.Name.ToLower() == "filename");
            string fileName = (fileNameParam == null) ? "" : fileNameParam.Value.Trim('"');
            byte[] file = await provider.Contents[0].ReadAsByteArrayAsync();
            MemoryStream imgStream = new MemoryStream(file);
            Bitmap mg = new Bitmap(imgStream);
            List<Size> sizes = new List<Size>();
            sizes.Add(new Size { Width = mg.Width, Height = mg.Height });
            sizes.Add(new Size { Width = 100, Height = 100 });
            sizes.Add(new Size { Width = 300, Height = 300 });
            sizes.Add(new Size { Width = 500, Height = 500 });
            sizes.Add(new Size { Width = 800, Height = 800 });
            int index = 0;
            foreach (var size in sizes)
            {
                byte[] newImageByteArray = Helpers.CreateImageThumbnail(file, Convert.ToInt32(size.Width), Convert.ToInt32(size.Height));
                Helpers.SaveProfileImage(newImageByteArray, agentId, size, index == 0 ? true : false);
                index++;
               //---*--->>Here I Should check here that if original & 100x100 image were uploaded then return a response and continue uploading the others (if(index>1))
            }
            var path = "/users/uploads/100/" + userId+ ".jpg" + "?v=" + Guid.NewGuid();

            UserManager.UpdateUploadImage(userId, path);
            response.ReturnObject = path;
            response.ReturnCode = ReturnCodes.Success;
            return Ok(response);
        }
        catch (Exception ex)
        {
            response.ReturnObject = ex;
            response.ReturnCode = ReturnCodes.Exception;
            return Ok(response);
        }

注意:客户端是angularJS应用程序,它发送给webapi服务器。任何想法如何重写代码,以实现这一点?

WebAPI有条件地和异步地返回响应

我试着让我的ActionResult作为一个异步任务,但我有麻烦做它。

这不是正确的解决方案,因为async不改变HTTP协议(正如我在我的博客上所描述的)。它不可能是正确的解决方案,因为:

然后返回100x100图像的路径给用户。

web请求如何向用户返回响应,然后再返回(返回路径)?这对于HTTP这样的请求/响应协议是不可能的;每个请求只能得到一个响应。

在我的例子中,用户要等到所有的大小调整和上传完成,这显然不利于用户体验。

你的选择是:

  1. 放置一个复杂的解决方案,跟踪独立于HTTP请求的工作(这通常需要一个可靠的队列,如Azure队列连接到一个独立的worker服务,如Azure Function),然后提供一些主动通知UI完成的方法(SignalR很好,除非你需要扩展到非常大的规模,在这种情况下轮询实际上可能更好)。在客户端使用AJAX

注意你已经在做(2)了:

客户端是angularJS应用,它向webapi服务器发送信息。

因此,您所要做的就是更改客户端,这样它就不会在允许用户执行其他操作之前等待请求。不需要更改服务器