2010-03-29 7 views
11

in der Regel, wenn ich auf eine ASP.Net MVC-Anwendung schaue, wird die Route Tabelle beim Start konfiguriert und wird nie danach berührt.Ändern ASP.NET MVC-Routen dynamisch

Ich habe ein paar Fragen über das, aber sie sind eng miteinander verwandt:

  • Ist es möglich, die Route-Tabelle zur Laufzeit zu ändern?
  • Wie würde/würde ich Threading-Probleme vermeiden?
  • Gibt es vielleicht eine bessere Möglichkeit, eine dynamische URL bereitzustellen? Ich weiß, dass IDs usw. in der URL erscheinen können, aber ich kann nicht sehen, wie dies in dem, was ich erreichen möchte, anwendbar sein könnte.
  • Wie kann ich vermeiden, dass, obwohl ich die Standard-Controller/Aktionsroute definiert habe, diese Standardroute nicht für eine bestimmte Kombination funktioniert, z. Die Aktion "Post" auf dem Controller "Kommentare" ist nicht über die Standardroute verfügbar?

Hintergrund: Kommentar Spammers greifen in der Regel über die Entsendung URL von der Website und dann nicht die Mühe über die Website gehen mehr ihre automatisierten Spam zu tun. Wenn ich meine Post-URL regelmäßig ändere, müssten Spammer auf die Seite zurückkehren und die richtige Post-URL finden, um Spamming zu versuchen. Wenn sich diese URL ständig ändert, würde ich denken, dass dies die Arbeit der Spammer mühsamer machen könnte, was normalerweise bedeuten sollte, dass sie die betroffene URL aufgeben.

+0

Wie haben Sie dieses Problem gelöst.Können Sie bitte mit mir teilen? –

Antwort

3

Betrachtet man den tatsächlichen Hintergrund des Problems, besteht der übliche Ansatz darin, eine dynamisch erstellte Transaktionsnummer anzugeben. Es sollte in einem versteckten Formularfeld sowie im serverseitigen Sitzungswörterbuch gespeichert werden und nur für genau eine Anfrage gültig sein.

Ich denke, heute bieten viele Frameworks einen solchen Sicherheitsmechanismus; während dieser Angriffstyp als Cross-Site-Request-Forgery (CSRF) bekannt ist.

11

Ich würde in Erwägung ziehen, meinen eigenen IRouteHandler zu implementieren und einige benutzerdefinierte Logik in meinen benutzerdefinierten ControllerActionInvoker. Wie es funktionieren würde? Die Routentabelle würde sich nicht dynamisch ändern, Sie könnten jedoch Ihren benutzerdefinierten ControllerActionInvoker für einen zufälligen Parameter im Routenpfad einchecken und die entsprechende Aktion aufrufen oder nicht.

Meine Route:

routes.Add 
( 
    new Route 
     ( 
      "blog/comment/{*data}", 
      new RouteValueDictionary(new {controller = "blog", action = "comment", data = ""}), 
      new MyRouteHandler() 
     ) 
); 

My I Route Handler:

class MyRouteHandler : IRouteHandler 
{ 

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new MyHttpHandler(requestContext); 
    } 
}` 

Mein Handler:

class MyHttpHandler : MvcHandler 
{ 
    public MyHttpHandler(RequestContext requestContext) : base(requestContext) 
    { 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
     IController controller = new BlogController(); 
     (controller as Controller).ActionInvoker = new MyActionInvoker(); 
     controller.Execute(RequestContext); 
    } }` 

und meine Aktion ivoker, wo die benutzerdefinierte Logik für eine Aktion der Handhabung oder nicht sollte codiert werden:

class MyActionInvoker : ControllerActionInvoker 
{ 
    protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> parameters) 
    { 

     var data = ControllerContext.RouteData.GetRequiredString("data"); 


// put my custom logic to check whetever I'll handle the action or not. The data could be a parameter in the database for that purpose. 

     return base.InvokeActionMethod(methodInfo, parameters); 
    } 
} 

Ich weiß es nicht, es ist die beste Lösung, aber für jetzt ist es die, die mir in den Sinn kommt.

+0

Danke, ich werde mir das auch ansehen – flq