public class HttpStatusCodeResult : ActionResult
{
public HttpStatusCodeResult(int statusCode);
public HttpStatusCodeResult(HttpStatusCode statusCode);
public HttpStatusCodeResult(int statusCode, string statusDescription);
public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.StatusCode = StatusCode;
if (StatusDescription != null)
context.HttpContext.Response.StatusDescription = StatusDescription;
}
public int StatusCode { get; }
public string StatusDescription { get; }
}
StatusDescription,需 IIS 才生效。404 Not Found、401 Unauthorized、500 Internal Server Error。HttpNotFoundResult:new HttpStatusCodeResult(404),Controller 提供 HttpNotFound() 便利方法。HttpUnauthorizedResult:new HttpStatusCodeResult(401),AuthorizeAttribute 驗證失敗時回傳。public class RedirectResult : ActionResult
{
public RedirectResult(string url);
public RedirectResult(string url, bool permanent);
public override void ExecuteResult(ControllerContext context)
{
string url = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
if (Permanent)
context.HttpContext.Response.RedirectPermanent(url, false); // 301
else
context.HttpContext.Response.Redirect(url, false); // 302
}
public bool Permanent { get; }
public string Url { get; }
}
| 類型 | HTTP 狀態碼 | 瀏覽器行為 | SEO 影響 |
|---|---|---|---|
| 暫時 (302) | 302 Found | 不快取,每次請求原 URL | 保留原 URL 權重 |
| 永久 (301) | 301 Moved Permanently | 快取導向目標,後續直接請求新 URL | 轉移權重至新 URL |
Controller 提供 Redirect(url) (302) 與 RedirectPermanent(url) (301) 便利方法。
public class RedirectToRouteResult : ActionResult
{
public RedirectToRouteResult(RouteValueDictionary routeValues);
public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues);
public RedirectToRouteResult(RouteValueDictionary routeValues, bool permanent);
public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues, bool permanent);
public override void ExecuteResult(ControllerContext context)
{
var url = UrlHelper.GenerateUrl(RouteName, null, null, RouteValues, RouteTable.Routes, context.RequestContext, true);
if (Permanent) context.HttpContext.Response.RedirectPermanent(url, false);
else context.HttpContext.Response.Redirect(url, false);
}
public RouteValueDictionary RouteValues { get; }
public string RouteName { get; }
public bool Permanent { get; }
}
RedirectToAction(action, controller)、RedirectToRoute(routeValues) 等多載。HttpStatusCodeResult 為低層級 HTTP 狀態控制,RedirectResult 與 RedirectToRouteResult 封裝 301/302 重導向語意。實務上優先使用 Controller 便利方法 (HttpNotFound、RedirectToAction 等) 而非直接實例化 Result 類別。