0

Il ya quelques mois, j'ai écrit une application WebApi avec quelques attributs personnalisés. Cela fonctionne très bien.mvc 5 attributs sur le contrôleur sont ignorés

Je suis en train d'écrire un nouveau site Web MVC 5.2.3 et je voulais inclure les mêmes attributs. Je les ai déplacés et le projet se construit et tourne bien, sauf que les attributs sont ignorés.

Ceci est mon décoration contrôleur:

[AuthorizeIt(Roles = "theRole")] 
[LogRequestResponse] 
public class HomeController : Controller{} 

Cette signature de mes deux attributs:

public class LogRequestResponseAttribute : ActionFilterAttribute 


[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)] 
public class AuthorizeItAttribute : AuthorizeAttribute 

Je peux inclure plus de code, mais je ne pense pas qu'il est en fait un problème de code depuis cela fonctionne dans mon autre site Web. Je suppose que c'est une différence entre le MVC et WebApi et il y a quelques petits détails qui me manquent.

Et oui, je suis conscient que ASP.core intègre webApi et MVC et résoudrait les problèmes auxquels je suis confronté mais mon travail ne l'aura pas permis.

Merci,

Bob

+0

Informations complémentaires: New Info: Si je change mon contrôleur pour hériter de ApiController mes attributs fonctionnent très bien. Change backand ils ne le font pas. – Bob

Répondre

0

je résolu la plupart de mes problèmes et avoir un dernier élément que je ne peux pas résoudre. En un mot, au niveau le plus élevé en ce qui concerne les attributs, WebAPI et MVC semblent avoir des objets identiques, mais au fur et à mesure que les choses vont plus loin, les choses deviennent différentes. Par exemple: AuthorizeAttribute est très différent en fonction de l'espace de noms que vous utilisez. La version MVC souhaite un paramètre AuthorizationContext tandis que WebApi veut un HttpActionContext.

Un autre exemple est que la fonction OnActionExecuted veut un paramètre ActionExecutedContext en tant que paramètre pour MVC mais webApi veut un HttpActionExecutedContext. En résumé, tout ce que je pouvais faire était de récupérer mes attributs WebApi originaux dans mon projet MVC, puis de commencer par m'assurer que vous étiez dans l'espace de noms MVC, puis de commencer à forer et à modifier les objets.

J'ai été capable de trouver un équivalent MVC pour chaque morceau de code webApi sauf un.

Pour WebAPI, dans la fonction OnActionExecuted je peux obtenir le contenu de la réponse avec:

var response = actionContext.Response?.Content?.ReadAsStringAsync().Result; 

où:

actionContext is a HttpActionExecutedContext 

Mais dans MVC

actionContext is a ActionExecutedContext 

Alors le code webapi ci-dessus qui obtient la réponse ne fonctionnera pas dans MVC. D'après ce que j'ai lu le contenu de la réponse dans MVC est situé à:

actionContext.HttpContext.Response.Filter 

qui est un cours d'eau. Mais peu importe combien de façons différentes j'ai essayé de lire le flux, il est toujours dans un état illisible.

La dernière partie sans réponse de ma question est la suivante:

MVC 5: Je vous écris un attribut personnalisé. Je suis dans la fonction:

public override void OnActionExecuted(ActionExecutedContext actionContext) 

Et je veux lire le contenu de la réponse que je peux par exemple vous connecter ou le modifier, ou autre chose.

En résumé:

  1. La solution générale à la question est de commencer avec soin en haut de la coutume des attributs, changer l'espace de nom pour MVC puis travailler dans le code en remplaçant le code WebAPI avec l'équivalent MVC. Très ennuyeux et ennuyeux. Si quelqu'un essaie quelque chose de similaire et a des questions, je serais heureux de vous aider.

  2. Il ya une dernière partie du code pour laquelle je ne trouve pas de traduction et j'espère que quelqu'un d'autre connait la réponse.

Merci .... Bob