在 foreach 循环中将 base64 字符串添加到数组列表需要很长时间才能在 azure 服务器中响应 return
Adding base64 string to array list in foreach loop takes long time in azure server to return response
我有一个全栈应用程序,其中前端应用程序使用 angular,后端应用程序使用 .Net Core 5 web api。
该应用程序在本地环境中运行良好,api returns 以微秒为单位响应,但在生产中 api 需要 7 到 10 分钟才能响应。从数据库中拉取的数据并不大;仅从数据库中提取了 400 个客户端。
在调查问题后,我发现一个 base64 字符串是通过转换数组图像的字节而形成的。将转换后的字符串添加到数组列表中会导致 api 从服务器拉取数据的速度非常慢。
下面是部分代码实现。
我的界面Class
{
List<ClientsList> GetClientsList();
}
我的服务Class
public List<ClientsList> GetClientsList()`
{
var clients = _dbBconnection.employees.Include(x => x.Department).Include(y => y.EmployeeJobTitle);
if (clients != null)
{
List<ClientsList> clientsLists= new List<ClientsList>();
foreach (var data in clients )
{
var folderName = Path.Combine("Resources", "Images");
var filePath = folderName + '\' + data.PassportSize;
var byteArrImg = File.ReadAllBytes(filePath);
var base64Img = Convert.ToBase64String(byteArrImg);
var employeeData = new ClientsList()
{
ClientId = data.ClientId,
Fname = data.Fname,
Mname = data.Mname,
Lname = data.Lname,
Dob = data.Dob,
Gender = data.Gender,
PhoneNo = data.PhoneNo,
ImageData = base64Img
};
clientsLists.Add(employeeData);
}
return clientsLists;
}
else
{ return null; }
}
我的控制器Class
[HttpGet()]public List<ClientsList> GetClientsList()
{
return ClientsManagerInterface.GetClientsList();
}
我应该最小化 base64 字符串吗?或者我还应该做什么?
当字符串很短时——例如当base64Image = "jejrhwejrhehrjehrhwejrhwejrwerhwjerhwejrhwje"
时——api会在几微秒内提取数据。当字符串变大时问题就来了。
我尝试通过硬编码将字符串最小化,并且成功了,但是字节数组图像的转换导致了一个大的 base64 字符串,并且出现了问题。
不要 return 将完整的图像数据作为此 API 调用的一部分发送给客户端! 难怪它很慢,如果你正在尝试return 同一响应中的几百张图片。根据每个图像的大小,您可能会尝试传输超过 1 GB 的数据,所有这些都必须在 angular 甚至可以开始对其执行任何操作之前接收到。对于试图在移动设备和数据计划上加载该应用程序的人,我感到特别抱歉。
相反,return URL 对于您的应用可以与 <img />
的 src
属性一起使用的每个图像元素.
您可能还想考虑对这些数据进行分页,并且一次只return分页一页的数据。
我有一个全栈应用程序,其中前端应用程序使用 angular,后端应用程序使用 .Net Core 5 web api。
该应用程序在本地环境中运行良好,api returns 以微秒为单位响应,但在生产中 api 需要 7 到 10 分钟才能响应。从数据库中拉取的数据并不大;仅从数据库中提取了 400 个客户端。
在调查问题后,我发现一个 base64 字符串是通过转换数组图像的字节而形成的。将转换后的字符串添加到数组列表中会导致 api 从服务器拉取数据的速度非常慢。
下面是部分代码实现。
我的界面Class
{
List<ClientsList> GetClientsList();
}
我的服务Class
public List<ClientsList> GetClientsList()`
{
var clients = _dbBconnection.employees.Include(x => x.Department).Include(y => y.EmployeeJobTitle);
if (clients != null)
{
List<ClientsList> clientsLists= new List<ClientsList>();
foreach (var data in clients )
{
var folderName = Path.Combine("Resources", "Images");
var filePath = folderName + '\' + data.PassportSize;
var byteArrImg = File.ReadAllBytes(filePath);
var base64Img = Convert.ToBase64String(byteArrImg);
var employeeData = new ClientsList()
{
ClientId = data.ClientId,
Fname = data.Fname,
Mname = data.Mname,
Lname = data.Lname,
Dob = data.Dob,
Gender = data.Gender,
PhoneNo = data.PhoneNo,
ImageData = base64Img
};
clientsLists.Add(employeeData);
}
return clientsLists;
}
else
{ return null; }
}
我的控制器Class
[HttpGet()]public List<ClientsList> GetClientsList()
{
return ClientsManagerInterface.GetClientsList();
}
我应该最小化 base64 字符串吗?或者我还应该做什么?
当字符串很短时——例如当base64Image = "jejrhwejrhehrjehrhwejrhwejrwerhwjerhwejrhwje"
时——api会在几微秒内提取数据。当字符串变大时问题就来了。
我尝试通过硬编码将字符串最小化,并且成功了,但是字节数组图像的转换导致了一个大的 base64 字符串,并且出现了问题。
不要 return 将完整的图像数据作为此 API 调用的一部分发送给客户端! 难怪它很慢,如果你正在尝试return 同一响应中的几百张图片。根据每个图像的大小,您可能会尝试传输超过 1 GB 的数据,所有这些都必须在 angular 甚至可以开始对其执行任何操作之前接收到。对于试图在移动设备和数据计划上加载该应用程序的人,我感到特别抱歉。
相反,return URL 对于您的应用可以与 <img />
的 src
属性一起使用的每个图像元素.
您可能还想考虑对这些数据进行分页,并且一次只return分页一页的数据。