我的 api 上有一个图像渲染方法,用户通过 url 访问它,以便将图像显示为源。我在本地测试时没有问题,因为我只发出单个用户请求。但是当我部署它时,登台/生产测试人员进来了。由于内部服务器错误,正在渲染的图像被破坏,我猜这是因为多个请求。
这是我的做法:
[Route("userprofileimage")]
public class UserProfileImageController : Controller
{
[Route("render")]
public FileResult Render(string di, string tk, string fi)
{
if (!string.IsNullOrEmpty(di) && !string.IsNullOrEmpty(tk) && !string.IsNullOrEmpty(fi))
{
var filePath = Path.Combine(Path.Combine(Server.MapPath("~/App_Data/UserProfileImages"), fi));
var isValid = new UserTokenService().ValidateUserToken(Guid.Parse(di), tk);
if(isValid)
{
if (ImageFileNotAvailable(filePath))
return new FileStreamResult(new FileStream(Path.Combine(Server.MapPath("~/App_Data/UserProfileImages"), "default.png"), FileMode.Open), "image/png");
else
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "image/png");
}
}
return new FileStreamResult(new FileStream(Path.Combine(Server.MapPath("~/App_Data/UserProfileImages"), "default.png"), FileMode.Open), "image/png");
}
private bool ImageFileNotAvailable(string fullFilePath)
{
return !System.IO.File.Exists(fullFilePath);
}
}
如您所见,在实际渲染图像之前有令牌和 id 检查。
我对这个方法没有具体的理由。我只是觉得将链接作为图像源很方便。
我期待来自多个用户的请求会等到之前的执行完成后再进入,但我猜他们同时进入。因此,在某些时候,文件当前处于打开状态或正在被操作,并且另一个请求进来了。因此出现了错误。
关于如何改进这一点的任何想法?