Question

Problème

Mon projet actuel nécessite que je fasse différentes choses en fonction de différents en-têtes de requêtes HTTP pour presque chaque action.

Actuellement, j'ai un contrôleur massif (tous pour le même type de ressource) et chaque méthode d'action possède un attribut ActionName (pour que je puisse avoir plusieurs versions d'une même action prenant les mêmes paramètres, mais faisant des choses différentes). et un FilterAttribute personnalisé (implémenté presque exactement comme AcceptVerbsAttribute dans Preview 5) qui vérifie si certains en-têtes ont certaines valeurs.

J'aimerais vraiment insérer le code dans des contrôleurs distincts et laisser la RouteTable sélectionner l'un d'entre eux en fonction des en-têtes, mais je ne peux pas penser à la manière la plus propre de le faire.

Exemple

Par exemple, disons que j'ai une liste de fichiers. Le service doit traiter la demande de l'une des deux manières suivantes:

  1. Le client souhaite un fichier zip et passe le message "accept: application / zip". comme en-tête, je prends la liste des fichiers, les compresse dans un fichier zip et les renvoie au client.

  2. Le client souhaite une page HTML. Le site renvoie "accepter: text / html", le site renvoie une page html sous forme de tableau répertoriant les fichiers.

Était-ce utile?

La solution

Il semble que votre comportement diffère légèrement de celui de vos actions en fonction de l'en-tête qui entre. J'essayerais d'isoler les différences autant que possible.

Par exemple, si la logique de l'application est la même, mais que la seule différence réside dans le rendu de la réponse à l'utilisateur, vous pouvez envisager d'écrire un ActionResult personnalisé qui effectue différentes actions en fonction des en-têtes HTTP.

Toutefois, si la logique est complètement différente, vous pouvez implémenter une contrainte de routage personnalisée (IRoutConstraint) que vous associez à chaque route. Jetez un coup d’œil à l’implémentation de HttpMethodConstraint pour des idées.

Autres conseils

Je ne suis pas sûr que vous ayez besoin de contrôleurs distincts en fonction de l'en-tête. cette structure semble parfaitement raisonnable. Si votre contrôleur est énorme comme vous le dites, demandez-vous s’il s’agit de ressources multiples, et si c’est le cas, il devrait peut-être être divisé en plusieurs contrôleurs en fonction des ressources?

Je ne sais pas si c'est possible, mais il semble que cela ressemble à l'attribut AcceptVerbs qui était ajouté dans l'aperçu 5 . Je regarderais comment cela a été implémenté (obtenez le source MVC) pour voir si vous pouvez ajouter quelque chose de similaire en fonction du type de contenu.

Vous devriez consulter cet article . Il décrit l’implémentation des réponses json et xml en fonction de l’en-tête http.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top