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服务器。任何想法如何重写代码,以实现这一点?
我试着让我的ActionResult作为一个异步任务,但我有麻烦做它。
这不是正确的解决方案,因为async
不改变HTTP协议(正如我在我的博客上所描述的)。它不可能是正确的解决方案,因为:
然后返回100x100图像的路径给用户。
web请求如何向用户返回响应,然后再返回(返回路径)?这对于HTTP这样的请求/响应协议是不可能的;每个请求只能得到一个响应。
在我的例子中,用户要等到所有的大小调整和上传完成,这显然不利于用户体验。
你的选择是:
- 放置一个复杂的解决方案,跟踪独立于HTTP请求的工作(这通常需要一个可靠的队列,如Azure队列连接到一个独立的worker服务,如Azure Function),然后提供一些主动通知UI完成的方法(SignalR很好,除非你需要扩展到非常大的规模,在这种情况下轮询实际上可能更好)。在客户端使用AJAX
注意你已经在做(2)了:
因此,您所要做的就是更改客户端,这样它就不会在允许用户执行其他操作之前等待请求。不需要更改服务器客户端是angularJS应用,它向webapi服务器发送信息。