2010-03-29 9 views
11

In genere, quando guardo un'applicazione ASP.Net MVC, la tabella Route viene configurata all'avvio e non viene mai toccata.Modifica ASP.NET MVC Percorsi dinamicamente

Ho un paio di domande su questo, ma essi sono strettamente correlati gli uni agli altri:

  • E 'possibile modificare la tabella di route in fase di esecuzione?
  • Come/dovrei evitare problemi di threading?
  • C'è forse un modo migliore per fornire un URL dinamico? So che gli ID ecc. Possono apparire nell'URL ma non riesco a vedere come ciò potrebbe essere applicabile a ciò che voglio ottenere.
  • Come posso evitare che, anche se ho definito il controller/percorso di azione predefinito, quella route predefinita non funziona per una combinazione specifica, ad es. l'azione "Post" sul controller "Commenti" non è disponibile attraverso il percorso predefinito?

Background: Commento Gli spammer di solito afferrare l'URL distacco dal sito web e quindi non si preoccupano di passare attraverso il sito web più per fare il loro spamming automatizzato. Se modifico regolarmente il mio URL del post su uno casuale, gli spammer dovrebbero tornare sul sito e trovare l'URL corretto per il post per provare lo spamming. Se quell'URL dovesse cambiare di continuo, penserei che ciò potrebbe rendere più noioso il lavoro degli spammer, il che di solito significa che si arrendono sull'URL interessato.

+0

Come hai risolto questo problema. Per favore, condividi con me ?? –

risposta

3

Considerando lo sfondo reale del problema, l'approccio abituale consiste nell'includere un numero di transazione creato in modo dinamico. Dovrebbe essere memorizzato in un campo modulo nascosto e nel dizionario di sessione lato server e sarà valido solo per una sola richiesta.

Penso che oggi molti framework forniscano un tale meccanismo di sicurezza; mentre questo tipo di attacco è noto come Cross-Site-Request-Forgery (csrf).

11

Vorrei prendere in considerazione l'implementazione del mio IRouteHandler e inserire alcune regole personalizzate nel mio ControllerActionInvoker personalizzato. Come funzionerebbe? La tabella di instradamento non cambierebbe dinamicamente ma potevi controllare il tuo ControllerActionInvoker personalizzato per un parametro casuale nel percorso della rotta e invocare o meno l'azione corrispondente.

il mio percorso:

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

mio gestore mi rotta:

class MyRouteHandler : IRouteHandler 
{ 

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

mio gestore:

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); 
    } }` 

e la mia ivoker azione in cui la logica personalizzata per la gestione di un'azione o no dovrebbe essere codificato:

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); 
    } 
} 

Non so che sia la soluzione migliore ma per ora è quella che mi viene in mente.

+0

Grazie, guarderò anche quello – flq