Je cherchais une réponse à cette question ces dernières heures sans succès. Je suis relativement nouveau en programmation, alors allez-y doucement :-)
Mon problème est qu’il semble que je ne peux pas utiliser IActionResult dans l’un de mes projets de ma solution qui cible .NET Framework 4.6.1, mais que je puisse l’utiliser dans la même solution (projet différent) .NET Standard 2.0.
J'ai essayé d'installer exactement les mêmes packages Nuget et tout a exactement la même apparence, à l'exception du framework ciblé.
Je veux juste écrire Azure Functions en utilisant IActionResults comme:
public static async Task<IActionResult> MyFuntcion([HttpTrigger(AuthorizationLevel.Function, "get", Route = null")]HttpRequest req, TraceWriter log)
{
//Do some stuff then redirect
}
Je suppose que mon framework ciblé est ce qui me empêche de pouvoir utiliser IActionResult, mais je ne comprends pas pourquoi.
Toute aide serait très appréciée, surtout si l’on savait comment faire fonctionner ce travail.
Je vous remercie
Version courte
Vous ne pouvez pas utiliser IActionResult dans un API Full Framework MVC ou Web en tant qu'objet résultat. Vous devrez d'abord le mapper sur le type approprié. Vous devriez probablement pas utiliser IActionResult dans vos bibliothèques de classes, laissez le projet principal gérer les types de retour
Mais ASP.NET Core ne nécessite pas le runtime .NET Core, il peut également cibler Full Framework. Peut-être pouvez-vous utiliser un projet ASP.NET Core ciblant la structure complète de votre projet principal?
Explication
ASP.NET Core est le "nouveau" nom d’ASP.NET 5. Il s’agit d’un nouveau framework qui fusionne les piles MVC et Web API et a été conçu pour être exécuté à la fois sur l’ancien framework Full et sur ce qui était alors appelé DNXCore. Les deux noms ont changé pour ASP.NET Core 1.0 et Core .NET 1.0, ce qui a créé la confusion qui règne aujourd'hui.
Avant ASP.NET Core, ASP.NET MVC et l'API Web étaient deux piles différentes, ils utilisaient différentes classes de base de contrôleur et renvoyaient des résultats différents. ASP.NET MVC a utilisé abstract ActionResult class et l’API Web a utilisé l’interface IHttpActionResult . Utiliser une interface signifie que c'est un lot plus facile à tester et à simuler les résultats, entre autres choses. Cela signifie également que les classes qui l'implémentent n'ont pas à gérer des propriétés et des méthodes de base potentiellement inutiles.
Dans ASP.NET Core, l’infrastructure Web, l’ensemble de la pile a été repensé. Il existe désormais une pile unique avec une interface de base unique pour les résultats, IActionResult . Core's ActionResult est l'implémentation par défaut, mais tout le monde peut créer une implémentation différente. RedirectResult par exemple, n'a pas besoin d'une propriété Content, donc il n'en a pas.
Cette interface est disponible pour chaque bibliothèque .NET Standard 2.0 tant que le package approprié est ajouté.
Cela ne signifie toutefois pas qu'il puisse être utilisé comme type de retour réel dans les projets ASP.NET MVC 6 ou Web API 2, car ni ActionResult de MVC ni IHttpActionResult de l'API Web ne l'implémentent. Il faudrait écrire du code pour mapper une instance concrète IActionResult vers une instance concrète MVC ActionResult ou Web API IHttpActionResult.
Si votre projet principal est ASP.NET Core, vous pouvez utiliser l'interface, qu'elle s'exécute sur le framework Full ou Core.
.NET Standard
.NET Standard est un ensemble de spécifications de l'API et non d'un moteur d'exécution spécifique. Chaque version spécifie un ensemble de classes et d'API devant être fournies par un environnement d'exécution conforme à cette version standard. Quand on crée une bibliothèque .NET Standard 2.0, cela signifie que le code peut utiliser n’importe laquelle des classes et des API définies dans la version 2.0.
Ajoutant uniquement l'interface
IActionResult fait pas partie de .NET Standard 2.0. Il est fourni par un package Microsoft.AspNetCore.Mvc.Abstractions .
SOLUTION.
Je devais installer le package Microsoft.AspNetCore.Mvc afin de le faire fonctionner . Sry pour mes questions de débutant et merci beaucoup pour l'aide.
Edit: Comme @PanagiotisKanavos écrit suffisamment avec le package Microsoft.AspNetCoreMvc.Abstractions pour IActionResult. J'avais besoin de quelque chose d'autre au-delà, alors j'ai choisi le paquet entier.
Existe-t-il même en .net? Il semble n'exister que dans le noyau .net.
Source sur Microsoft:
Voir "S'applique à" sur cette page.