0

我的 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 检查。

我对这个方法没有具体的理由。我只是觉得将链接作为图像源很方便。

我期待来自多个用户的请求会等到之前的执行完成后再进入,但我猜他们同时进入。因此,在某些时候,文件当前处于打开状态或正在被操作,并且另一个请求进来了。因此出现了错误。

关于如何改进这一点的任何想法?

4

0 回答 0