以前在ASP.NET中,如果要响应指定的HTTP状态代码,都是使用HttpResponse.StatusCode属性进行操作。在ASP.NET MVC可以使用控制器HttpStatusCodeResult操作结果来返回指定的HTTP状态码。
文章中演示项目下载:ASP.NET MVC Dynamic Http Code.zip
另外还有HttpNotFound和HttpUnauthorizedResult这两个操作结果可以返回404和401状态码,这两个类都是派生于HttpStatusCodeResult类,具体代码如下:
/// <summary>
/// 返回指定的HTTP状态代码
/// </summary>
/// <returns></returns>
public ActionResult ResponseAssignHttpCode(int statusCode=500)
{
return new HttpStatusCodeResult(statusCode);
}
/// <summary>
/// 返回HTTP 404响应代码
/// </summary>
/// <returns></returns>
public ActionResult Response404HttpCode()
{
return HttpNotFound();
}
/// <summary>
/// 返回HTTP 401响应代码
/// </summary>
/// <returns></returns>
public ActionResult Response401HttpCode()
{
return new HttpUnauthorizedResult();
}
有兴趣的朋友可以研究下这几个操作结果的源码:
- HttpStatusCodeResult.cs
- HttpUnauthorizedResult.cs
- HttpNotFoundResult.cs
从源码中可以看出,HttpNotFoundResult和HttpUnauthorizedResult都是继承于HttpStatusCodeResult这个操作结果类:
至于HttpStatusCodeResult的跳转原理,就是通过设置HttpContext.Response.StatusCode属性来对HTTP响应的状态代码进行操作:
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.HttpContext.Response.StatusCode = StatusCode;
if (StatusDescription != null)
{
context.HttpContext.Response.StatusDescription = StatusDescription;
}
}
以往ASP.NET一般是直接操作HttpResponse.StatusCode属性来动态控制HTTP状态,只能说万变不离其宗吧。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98692.html