接下来鄙人面的内容中,将我想到的体式格局分享给人人,假如人人有别的的体式格局,请留言。
一、HttpPostAttribute特征
人人起首想到时的,MVC供应了HttpPostAttribute特征,是用于限定HTTP请求必需POST体式格局来提交。
1 public class HomeController : Controller2 { 3 [HttpPost]4 public ActionResult Index()5 {6 return View();7 }8 }
这个特征只能在Action要领上面做标记,须要我们在每个Action要领上面做标记,做一个Coder,这类体式格局,我们一定吸收不了。
1 //2 // 择要:3 // 示意一个特征,该特征用于限定操作要领,以便该要领仅处置惩罚 HTTP POST 请求。4 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]5 public sealed class HttpPostAttribute : ActionMethodSelectorAttribute6 {7 8 }View Code
二、运用HttpModule
Asp.Net管线中,能够经由过程 HttpModule 对 HttpApplication 对象中的事宜注册本身的事宜处置惩罚顺序,来掌握一切的HTTP请求。
1 public class HttpMethodModule : IHttpModule 2 { 3 public void Init(HttpApplication context) 4 { 5 context.PostMapRequestHandler += Context_PostMapRequestHandler; 6 } 7 8 private void Context_PostMapRequestHandler(object sender, EventArgs e) 9 {10 HttpApplication httpApplication = (HttpApplication) sender;11 HttpContext httpContext = httpApplication.Context;12 13 14 //推断当前是不是运用的是 MVC 框架来处置惩罚请求,别的的叨教不做掌握。15 MvcHandler mvcHandler = httpContext.Handler as MvcHandler;16 17 if (mvcHandler != null && httpContext.IsPostMethod() == false) {18 throw new HttpException(404, "接见的资本不存在。");19 }20 }21 22 public void Dispose()23 {24 25 }26 }
在Web.config增添相干的设置。
1 <?xml version="1.0" encoding="utf-8"?>2 <configuration>3 <system.webServer>4 <modules>5 <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/>6 </modules>7 </system.webServer>8 </configuration>
经由测试,是能够到达我们的请求(关于测试效果不在做演示)。
三、MVC过滤器
在MVC中,能够经由过程全局的过滤器来掌握请求。
1 public class HttpPostFilter : IAuthorizationFilter 2 { 3 public void OnAuthorization(AuthorizationContext filterContext) 4 { 5 if (filterContext.HttpContext.IsPostMethod() == false) { 6 7 //假如不是POST请求,则返回404。 8 filterContext.Result = new HttpNotFoundResult(); 9 }10 }11 }
在顺序启动时,注册为全局过滤器。
1 public class FilterConfig2 {3 public static void RegisterGlobalFilters(GlobalFilterCollection filters)4 {5 filters.Add(new HttpPostFilter());6 }7 }
四、路由束缚
在注册路由时,能够定义路由的束缚。经由过程以下体式格局,能够将请求体式格局限定为POST请求。
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9 //限定请求体式格局必需是POST10 , constraints:new { httpMethod = new HttpMethodConstraint("POST")}11 );12 }13 }
五、重写Controller要领
在MVC中,一切掌握器默许继续于Controller。
我们能够定义一个BaseController的抽象类,重写OnActionExecuting,别的的掌握器都继续于BaseController。
1 public abstract class BaseController : Controller 2 { 3 protected override void OnActionExecuting(ActionExecutingContext filterContext) 4 { 5 6 if (filterContext.HttpContext.IsPostMethod() == false) { 7 //假如不是POST请求,则返回404。 8 filterContext.Result = new HttpNotFoundResult(); 9 }10 else {11 base.OnActionExecuting(filterContext);12 }13 }14 }
这类要领,须要修正一切掌握器的基类,不引荐。
固然假如你已定义了本身的掌握器基类,这类体式格局的工作量也是异常小的。
总结
上述五种要领中,二、三、四要领都异常简朴,然则我比较引荐要领四,由于假如需求发生变化,保护工作量是最小的。
假如人人有别的的体式格局,请留言,感谢!
以上就是MVC 5限定一切HTTP请求必需是POST体式格局的细致内容,更多请关注ki4网别的相干文章!