MVC 5 beschränkt alle HTTP-Anfragen auf POST

巴扎黑
Freigeben: 2017-06-26 15:20:01
Original
2068 Leute haben es durchsucht

Ein Kollege hat heute eine Frage gestellt. Er wollte alle von MVC empfangenen HTTP-Anfragen auf POST beschränken.

Als nächstes werde ich Ihnen im folgenden Inhalt die Methode mitteilen, die ich mir ausgedacht habe. Wenn Sie andere Methoden haben, hinterlassen Sie bitte eine Nachricht.

1. HttpPostAttribute-Funktion

Das erste, was mir in den Sinn kommt, ist, dass MVC die HttpPostAttribute-Funktion bereitstellt, die verwendet wird, um HTTP-Anfragen einzuschränken, die im POST-Modus übermittelt werden sollen.

1   public class HomeController : Controller2   {        
3         [HttpPost]4         public ActionResult Index()5         {6             return View();7         }8   }
Nach dem Login kopieren

Diese Funktion kann nur für die Aktionsmethode markiert werden. Wir müssen jede Aktionsmethode markieren und einen Coder erstellen. Wir können diese Methode definitiv nicht akzeptieren.

1     //2     // 摘要:3     //     表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。4     [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]5     public sealed class HttpPostAttribute : ActionMethodSelectorAttribute6     {7 8     }
Nach dem Login kopieren
Code anzeigen

2. Verwenden von HttpModule

Im Asp.Net Pipeline können Sie über HttpModule Ihren eigenen Ereignishandler für Ereignisse im HttpApplication-Objekt registrieren, um alle HTTP-Anforderungen zu steuern.

 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     }
Nach dem Login kopieren

 Fügen Sie relevante Konfigurationen in Web.config hinzu.

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>
Nach dem Login kopieren

Nach dem Test kann es unsere Anforderungen erfüllen (die Testergebnisse werden nicht demonstriert).

3. MVC-Filter

In MVC können Anfragen über globale Filter gesteuert werden.

 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     }
Nach dem Login kopieren

Wenn das Programm startet, registrieren Sie sich als globaler Filter.

1     public class FilterConfig2     {3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)4         {5             filters.Add(new HttpPostFilter());6         }7     }
Nach dem Login kopieren

4. Routing-Einschränkungen

Beim Registrieren einer Route können Sie Routing-Einschränkungen definieren. Auf folgende Weise kann die Anfragemethode auf POST-Anfragen beschränkt werden.

 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     }
Nach dem Login kopieren

5. Überschreiben von Controller-Methoden

In MVC erben standardmäßig alle Controller vom Controller.

Wir können eine abstrakte Klasse von BaseController definieren, OnActionExecuting überschreiben und andere Controller von BaseController erben.

 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     }
Nach dem Login kopieren

Diese Methode erfordert die Änderung der Basisklassen aller Controller und wird nicht empfohlen.

Wenn Sie Ihre eigene Controller-Basisklasse definiert haben, ist der Arbeitsaufwand dieser Methode natürlich auch sehr gering.

Zusammenfassung

Von den oben genannten fünf Methoden sind die Methoden zwei, drei und vier sehr einfach, ich empfehle jedoch Methode vier, denn wenn sich die Anforderungen ändern, ist der Wartungsaufwand minimal.

Wenn Sie andere Methoden haben, hinterlassen Sie bitte eine Nachricht, danke!

Das obige ist der detaillierte Inhalt vonMVC 5 beschränkt alle HTTP-Anfragen auf POST. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage