单独项目中的MVC解决scheme中的Web API

我正在创build一个新的MVC4项目,研究使我相信从javascript到服务器端的通信现在可以通过web API框架而不是控制器动作来实现。 我的理解是否正确?

我假设我可以在Web API和MVC控制器之间共享我的所有属性等,所以对我来说这似乎不是一个巨大的改变。

当我设置应用程序时,我喜欢将组件分解到项目中。 我的计划是有一个MVC项目和一个Web API项目。 但是我遇到了问题。 例如,我已经结束了2个应用程序,单独的路由设置等。

所以我的问题是,在MVC应用程序中,应该将Web API框架放在同一个项目中,还是应该将Web API分离成一个自己的项目并解决问题?

不幸的是你错了 – 我假设我可以在web api和mvc控制器之间共享我所有的属性等等,所以对我来说这似乎不是一个巨大的改变。

Web API和MVC使用的许多概念,即使乍一看类似,实际上并不兼容。 例如,Web API属性是System.Web.Http.Filters.Filter而MVC属性是System.Web.Mvc.Filter – 它们是不可互换的。

同样适用于许多其他概念 – 模型绑定(完全不同的机制),路由(Web API使用HTTPRoutes而不是路由,即使它们都在相同的基础RouteTable上运行),依赖parsing器(不兼容)等等 – 尽pipe类似表面,在实践中是非常不同的。 而且,Web API没有区域的概念。

最终,如果你所要做的只是提供一个“新的,新潮的”服务JSON内容的方式,那么在走下去之前要三思。 我当然不会build议重构任何现有的代码,除非你真的想拥抱HTTP并以RESTful的方式构build你的应用程序。

这一切都取决于你正在build设的东西。 如果您正在开始一个新项目,并且您只需要提供一些JSON来简化您的Web应用程序 – 如果您愿意接受一些潜在的重复代码(如上面提到的那些代码),则可以轻松地在Web API中托pipeWeb API与ASP.NET MVC相同的项目。

如果您打算为您的在线服务构build适当的API,那么我只会将Web API分离到一个单独的项目中 – 可能会被外部客户或各种设备使用 – 例如为您的移动应用程序加油。

IMO,安全和部署应该推动你的决定。 例如,如果您的MVC应用程序使用表单身份validation,但是您有兴趣为您的API使用基本身份validation(使用SSL),单独的项目将使您的生活更轻松。 如果您想在www.example.com上托pipe您的网站,但将您的API托pipe为api.example.com(与www.example.com/api),单独的项目将使您的生活更轻松。 如果你分开你的项目和相应的子域名,并打算利用你自己的API从你的MVC应用程序,你将不得不弄清楚如何处理客户端调用您的API 相同的原产地问题。 常见的解决scheme是利用jsonp或CORS (如果可以的话)。

更新(3/26/2013):官方CORS支持即将到来: http ://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API

经过一定程度的经验(为应用程序和mvc创buildAPI)。 我主要都是这样做的。

我为来自其他客户端或其他设备(Android / IOS应用程序)的api调用创build了一个单独的项目。 其中一个原因是因为authentication是不同的,它是基于令牌的(保持无状态)。 我不想在我的MVC应用程序中混合使用。

对于我的JavaScript / jQuery API调用我的MVC应用程序,我喜欢保持简单的事情,所以我在我的MVC应用程序中包含一个Web API。 我不打算有我的JavaScript API调用基于令牌的身份validation,因为嘿,它在同一个应用程序。 我可以在API端点上使用[authorize]属性,当用户没有login时,他不会得到数据。

此外,在处理购物车时,如果您希望在会话中存储用户购物车(而未login),则需要在您的API中使用此购物车,以及通过JavaScript代码添加/删除产品。 这将确保您的API有状态,但也会降低您的MVC-API的复杂性。

SimpleInjector(IoC框架)的Stevenbuild议两个单独的项目: WebAPI中的DependencyResolver.SetResolver和HttpConfiguration.DependencyResolver之间的区别是什么

我最近做了几乎相同的事情:我从一个新的MVC 4 Web应用程序项目开始,selectVS2012中的Web API模板。

这将创build一个与MVC相同的应用程序托pipe的Web API。

我想将ApiControllers移入一个单独的类库项目。 这很容易,但解决scheme有点隐藏。

在MVC 4项目的AssemblyInfo.cs中添加类似的代码行

 [assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")] 

现在你需要类库LibraryRegistrator(随便命名它)

 public class LibraryRegistrator { public static void Register() { BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll"))); } } 

在MVC 4项目中还添加了对Api库的引用。

现在您可以将Api控制器添加到您自己的单独的类库(yourown.dll)中。

即使你的项目如此复杂以至于需要两个“前端”,那么我仍然只考虑将webapi分解成单独的项目作为最后的手段。 您将遇到部署困难,新手难以理解解决scheme的结构。 更不用说路由问题了。

我的目标是将system.web命名空间保留在一个“表示层”中。 尽pipewebapi不是表示性的,但仍然是应用程序接口的一部分。 只要你保持你的域名逻辑,而不是你的控制器,你不应该遇到太多的问题。 另外,不要忘记利用区域。

除了为Web.Api设置单独的DLL之外。

只是一个build议:

  1. 创build项目
  2. 金块WebActivatorEx
  3. 创build一个类app_start被调用的方法

    [程序集:WebActivatorEx.PostApplicationStartMethod(typeof(API.AppWebActivator),“开始”)]

    [assembly:WebActivatorEx.ApplicationShutdownMethod(typeof(API.AppWebActivator),“Shutdown”)]

  4. 在Start Method中注册一个web.api路由

    public static void Start(){GlobalConfiguration.Configure(WebApiConfig.Register); }

  5. 将项目引用到Web项目。 激活启动方法。

希望这可以帮助。

我试图将API控制器分成一个新的项目。 我所做的只是创build一个新的库项目,将控制器移动到名为API的文件夹中。 然后将库项目的引用添加到MVC项目。

webAPIconfiguration保留在MVC项目中。 它工作正常。