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