その場で機能する画像サイズ変更機能があります。実際の画像がサーバーで利用可能で、そのさまざまなサイズ (中、小) が存在しないとします。Application_error がキャプチャされ、ErrorController にリダイレクトされます。そこでサイズ変更が行われ、新しく作成された画像ファイルが 404 ではなくステータス 200 で返されます。
これは Visual Studio 2012 では問題なく動作しますが、IIS 7.5 に展開すると動作しなくなります。ここに Application_Error および ErrorController コードを配置しています
protected void Application_Error(object sender, EventArgs e)
{
var app = (MvcApplication)sender;
var context = app.Context;
var filePath = ((System.Web.HttpApplication)(app)).Request.FilePath;
var ex = app.Server.GetLastError();
context.Response.Clear();
context.ClearError();
var httpException = ex as HttpException;
var routeData = new RouteData();
routeData.Values["controller"] = "errors";
routeData.Values["exception"] = ex;
routeData.Values["action"] = "http500";
routeData.Values["id"] = filePath;
if (httpException != null)
{
switch (httpException.GetHttpCode())
{
case 404:
routeData.Values["action"] = "http404";
break;
case 403:
routeData.Values["action"] = "http403";
break;
case 500:
routeData.Values["action"] = "http500";
break;
}
}
IController controller = new JewelryPotSite.Controllers.ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));
}
エラーコントローラコードは
public ActionResult Http404(文字列 ID)
{
bool flag = false;
if (id.ToLower().Contains("/thumbnail/"))
{
flag = true;
string actualFilePath = id.ToLower().Replace("/thumbnail", "");
string test = Server.MapPath(actualFilePath);
if (System.IO.File.Exists(Server.MapPath(actualFilePath)))
{
if (!System.IO.File.Exists(Server.MapPath(id)))
{
Bitmap mg = new Bitmap(Server.MapPath(actualFilePath));
ResizeImage(mg, id, new Size(56, 56));
Response.StatusCode = 200;
}
}
else
{
Response.StatusCode = 404;
return Content("404", "text/plain");
}
}
if (id.ToLower().Contains("/medium/"))
{
flag = true;
string actualFilePath = id.ToLower().Replace("/medium", "");
string test = Server.MapPath(actualFilePath);
if (System.IO.File.Exists(Server.MapPath(actualFilePath)))
{
if (!System.IO.File.Exists(Server.MapPath(id)))
{
Bitmap mg = new Bitmap(Server.MapPath(actualFilePath));
ResizeImage(mg, id, new Size(250, 250));
Response.StatusCode = 200;
}
}
else
{
Response.StatusCode = 404;
return Content("404", "text/plain");
}
}
if (flag == false)
{
Response.StatusCode = 404;
ViewBag.Message = 404;
return View("Error");
}
return File(id, "image/JPEG");
//return Content("404", "text/plain");
}