Domanda

Problema

Il mio progetto attuale mi richiede di fare cose diverse in base a diverse intestazioni di richiesta HTTP per quasi ogni azione.

Attualmente, ho un controller enorme (tutti per lo stesso tipo di risorsa) e ogni metodo di azione ha un attributo ActionName (in modo da poter avere più versioni della stessa azione che accetta gli stessi parametri, ma fa cose diverse) e un personalizzato FilterAttribute (implementato quasi esattamente come AcceptVerbsAttribute nell'anteprima 5) che controlla se determinate intestazioni hanno determinati valori.

Mi piacerebbe davvero inserire il codice in controller separati e fare in modo che la RouteTable selezioni tra di loro in base alle intestazioni, ma non riesco a pensare al modo più pulito per farlo.

Esempio

Ad esempio, supponiamo che io abbia un elenco di file.Il servizio deve elaborare la richiesta in due modi:

  1. Il client desidera un file zip e passa "accetta:application/zip" come intestazione, prendo l'elenco dei file, li comprimo in un file zip e lo invio al client.

  2. Il client desidera una pagina html, quindi passa "accept:text/html", il sito restituisce una pagina html in formato tabella che elenca i file.

È stato utile?

Soluzione

Sembra che tu abbia un comportamento leggermente diverso dalle tue azioni in base all'intestazione che entra.Cercherei di isolare il più possibile le differenze.

Ad esempio, se la logica dell'applicazione è la stessa, ma l'unica differenza è il modo in cui rendi la risposta all'utente, potresti prendere in considerazione la scrittura di un ActionResult personalizzato che esegue azioni diverse in base alle intestazioni Http.

Tuttavia, se la logica è completamente diversa, potresti implementare un vincolo di routing personalizzato (IRoutConstraint) da allegare a ciascuna route.Dai un'occhiata all'implementazione di HttpMethodConstraint per le idee.

Altri suggerimenti

Non sono sicuro che tu abbia bisogno di controller separati in base all'intestazione;questa struttura sembra perfettamente ragionevole.Se il tuo controller è enorme come dici, considera se ha a che fare con più risorse e, in tal caso, forse dovrebbe essere suddiviso in più controller in base alla risorsa?

Non sono sicuro che sia possibile, ma sembra che sarebbe qualcosa di simile all'attributo AcceptVerbs che era aggiunto nell'anteprima 5.Darei un'occhiata a come è stato implementato (ottieni il sorgente MVC) per vedere se puoi aggiungere qualcosa di simile in base al tipo di contenuto.

Dovresti guardare questo post.Descrive l'implementazione per le risposte json e xml basate sull'intestazione http.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top