ソースとして画像を表示するために、ユーザーが URL を介してアクセスしている API の画像レンダリング メソッドがあります。単一のユーザー リクエストしか作成していないため、ローカルでテストしても問題はありません。しかし、私がそれを展開するまでに、ステージング/本番テスターが入ってきました。レンダリングされている画像は、内部サーバーエラーのために壊れています.複数のリクエストが原因だと推測しています.
これが私がそれを行う方法です:
[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 のチェックがあります。
これに対する私のアプローチに特別な理由はありません。画像ソースとしてリンクがあると便利だと思います。
複数のユーザーからのリクエストは、前の実行が完了するまで待機してから入ることを期待していましたが、同時に入ると思います。そのため、ある時点でファイルが現在開いているか操作されており、別のリクエストが着信します。したがって、エラーが発生します。
これを改善するにはどうすればよいですか?