2009-12-25 70 views
3

我有一個控制器,從數據庫中拉出圖像,重新調整它們的大小,將結果緩存在磁盤上,然後將圖像作爲Content()結果排出。如何從ASP.NET MVC應用程序返回404響應?

最近我在我的網站上添加了對「Scrape-buster」代碼的支持。也就是說,我將附加到每個圖像的唯一代碼加上一些鹽,並將該散列的前幾個字符傳遞給用戶,以便在檢索過程中進行確認。這使我可以防止人們刮掉網站上的所有圖片。 (如果沒有登錄,那麼也是抄襲HTML)。

反正,如果ScrapeBuster代碼不正確,我想從我的控制器返回一個404錯誤。有沒有內置的方法來做到這一點,或者我正在建立一個自定義的ActionResult

回答

6

最簡單的(可能不是最乾淨的)方法是拋出一個HttpException

public static void Throw404() 
{ 
    throw new HttpException(404, "The resource cannot be found"); 
} 

你應該確保沒有人在調用堆棧捕獲異常。通過這種方式,輸出會看起來像死404

正常ASP.NET黃屏的清潔方法是返回一個自定義的結果:

public sealed class HttpNotFoundResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     context.HttpContext.Response.StatusCode = 404; 
    } 
} 
+2

HttpNotFoundResult現在出現在System.Web.MVC中 - 你不需要編寫你自己的 – 2011-05-27 21:23:53

2

你可以通過返回一個HttpUnauthorizedResult發送403。這可以說是更正確的迴應,因爲URL是有效的,但不包含「授權」信息。如果您的網站配置正確,它也會將其重定向到您的登錄頁面。

1
public class NotFoundViewResult : ViewResult 
{ 
    public ViewResultNotFound() 
    { 
     ViewName = "NotFound"; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.TrySkipIisCustomErrors = true; 
     context.HttpContext.Response.StatusCode = 404; 

     base.ExecuteResult(context); 
    } 
} 

而且在~/Views/Shared文件夾

0

謝謝大家創造NOTFOUND查看,這裏是我想出了從你的答案:

public static class HttpErrorResultHelper 
{ 
    public static HttpErrorResult HttpError(this Controller controller, int statusCode) 
    { 
     return new HttpErrorResult 
     { 
      StatusCode = statusCode 
     }; 
    } 

    public static HttpErrorResult HttpError(this Controller controller, int statusCode, ActionResult chainedAction) 
    { 
     return new HttpErrorResult 
     { 
      StatusCode = statusCode, 
      ChainedAction = chainedAction, 
     }; 
    } 
} 

public sealed class HttpErrorResult : ActionResult 
{ 
    public int StatusCode { get; set; } 

    public ActionResult ChainedAction { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 

     context.HttpContext.Response.TrySkipIisCustomErrors = true; 
     context.HttpContext.Response.StatusCode = this.StatusCode; 

     if (this.ChainedAction != null) 
     { 
      ChainedAction.ExecuteResult(context); 
     } 
    } 
} 

這樣做是預先將狀態碼前的響應,同時仍然允許您發送實際視圖結果。

this.HttpError(404, this.View("NotFound")); 
5

爲什麼不直接使用內置的HttpNotFoundResult?

return HttpNotFound();

+0

我想顯示一個特定的視圖,同時包括一個404響應代碼。 – 2011-06-16 23:20:53

相關問題