Malheureusement, vous vous trompez à ce sujet - je présume que je peux partager tous mes attributs, etc. entre les contrôleurs Web api et mvc, donc à première vue, cela ne me semble pas un changement massif.
De nombreux concepts utilisés par l'API Web et MVC, même s'ils sont similaires à première vue, ne sont en fait pas compatibles. Par exemple, les attributs de l'API Web sont System.Web.Http.Filters.Filter
et les attributs MVC le sont System.Web.Mvc.Filter
- et ils ne sont pas interchangeables.
Il en va de même pour de nombreux autres concepts - liaison de modèle (mécanismes complètement différents), routes (l'API Web utilise HTTPRoutes et non Routes, même si elles fonctionnent toutes les deux sur la même RouteTable sous-jacente), résolveur de dépendances (non compatible) et plus encore - même si similaire sur le surface, sont très différents dans la pratique. De plus, l'API Web n'a pas de concept de zones.
En fin de compte, si tout ce que vous essayez de faire est d'avoir une façon «nouvelle et tendance» de diffuser du contenu JSON - réfléchissez à deux fois avant de vous engager dans cette voie. Je ne recommanderais certainement pas de refactoriser un code existant à moins que vous ne cherchiez vraiment à adopter HTTP et à créer votre application de manière REST.
Tout dépend vraiment de ce que vous construisez. Si vous démarrez un nouveau projet et que tout ce dont vous avez besoin est de servir du JSON pour faciliter votre application Web - à condition que vous soyez prêt à vivre avec du code potentiellement dupliqué (comme ce que j'ai mentionné ci-dessus), l'API Web pourrait facilement être hébergée dans le même projet que ASP.NET MVC.
Je ne séparerais l'API Web en un projet distinct que si vous envisagez de créer une API appropriée pour votre service en ligne - peut-être à utiliser par des clients externes ou par divers appareils - tels que l'alimentation de vos applications mobiles.
L'OMI, la sécurité et le déploiement devraient guider votre décision. Par exemple, si votre application MVC utilise l'authentification par formulaire mais que vous souhaitez utiliser l'authentification de base (avec SSL) pour votre API, des projets distincts vous faciliteront la vie. Si vous souhaitez héberger votre site sur www.example.com mais hébergez votre API sous api.example.com (par rapport à www.example.com/api), des projets séparés vous faciliteront la vie. Si vous séparez vos projets et les sous-domaines en conséquence et que vous avez l'intention d'exploiter votre propre API à partir de votre application MVC, vous devrez trouver comment gérer le problème de la même politique d'origine pour les appels côté client à votre API. Solutions communes à ce levier sont jsonp ou CORS ( de préférence si vous le pouvez).
Mise à jour (26/03/2013): le support officiel CORS arrive: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API
la source
Après un certain degré d'expérience (création d'API pour les applications et pour mvc). Je fais principalement les deux.
Je crée un projet séparé pour les appels d'API provenant d'autres clients ou d'autres appareils (applications Android / IOS). L'une des raisons est que l'authentification est différente, elle est basée sur des jetons (pour la garder sans état). Je ne veux pas mélanger cela dans mon application MVC.
Pour mes appels javascript / jquery api à mon application mvc, j'aime garder les choses simples afin d'inclure une API Web dans mon application MVC. Je n'ai pas l'intention d'avoir une authentification basée sur des jetons avec mes appels API javascript, car bon, c'est dans la même application. Je peux simplement utiliser l'
[authorize]
attribut sur un point de terminaison d'API, lorsqu'un utilisateur n'est pas connecté, il n'obtiendra pas les données.De plus, lorsque vous traitez avec des paniers d'achat et que vous souhaitez stocker le panier d'un utilisateur dans une session (sans être connecté), vous devez également l'avoir dans votre API si vous ajoutez / supprimez des produits via votre code javascript. Cela rendra votre API avec état à coup sûr, mais réduira également la complexité de votre MVC-API.
la source
Steven de SimpleInjector (cadre IoC) conseille deux projets distincts: Quelle est la différence entre DependencyResolver.SetResolver et HttpConfiguration.DependencyResolver dans WebAPI
la source
J'ai récemment fait presque la même chose: j'ai commencé avec un nouveau projet d'application Web MVC 4 en choisissant le modèle d'API Web dans VS2012.
Cela créera une API Web hébergée dans la même application que MVC.
Je voulais déplacer les ApiControllers dans un projet de bibliothèque de classes distinct. C'était assez simple mais la solution était un peu cachée.
Dans AssemblyInfo.cs du projet MVC 4, ajoutez une ligne de code similaire
Vous avez maintenant besoin de la classe LibraryRegistrator (n'hésitez pas à la nommer comme vous le souhaitez)
Dans le projet MVC 4, ajoutez également une référence à la bibliothèque Api.
Vous pouvez maintenant ajouter des contrôleurs Api à votre propre bibliothèque de classes distincte (yourown.dll).
la source
Même si votre projet est si complexe qu'il justifie deux "frontaux", je n'envisagerais toujours de diviser webapi en un projet distinct qu'en dernier recours. Vous aurez des maux de tête de déploiement et il serait difficile pour un débutant de comprendre la structure de votre solution. Sans parler des problèmes de routage.
Je viserais à garder l'espace de noms system.web isolé dans la seule "couche de présentation". Bien que le webapi ne soit pas de présentation, il fait toujours partie de l'interface de votre application. Tant que vous conservez la logique dans votre domaine et non dans vos contrôleurs, vous ne devriez pas rencontrer trop de problèmes. N'oubliez pas non plus d'utiliser les zones.
la source
En plus de configurer la DLL distincte pour Web.Api.
Juste une suggestion:
Créer une méthode de classe à appeler sur app_start
[assembly: WebActivatorEx.PostApplicationStartMethod (typeof (API.AppWebActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod (typeof (API.AppWebActivator), "Shutdown")]
Enregistrer des routes web.api dans la méthode de démarrage
public static void Start () {GlobalConfiguration.Configure (WebApiConfig.Register); }
Référencez le projet au projet Web. pour activer la méthode de démarrage.
J'espère que cela t'aides.
la source
J'ai essayé de diviser les contrôleurs d'API en un nouveau projet. Tout ce que j'ai fait est de créer un nouveau projet de bibliothèque, de déplacer les contrôleurs dans un dossier nommé API. Puis ajouté la référence du projet de bibliothèque au projet MVC.
La configuration webAPI est laissée dans le projet MVC lui-même. Ça fonctionne bien.
la source