REST API +网页使用的ASP.NET MVC与WCF


14

我认为针对面向程序的服务的用法与人机交互的讨论很明确。

但是,如果我要创建一个同时使用程序化API和使用通过同一API连接的数据的网站的应用程序,是否倾向于仅使用ASP.NET?

将ASP.NET和WCF集成到同一应用程序上有多容易?

Answers:


11

就编写一个同时利用ASP.NET/MVC和WCF的应用程序而言,它并不是很好。WebAPI可能已经改善了问题,但是在我熟悉的一个项目中,在同一应用程序中使用WCF和MVC,他们最终维护了两组不同的模型来表示相同的概念-一个用于WCF代码,另一个用于MVC。码。您可以想象他们为在两个模型之间转换内容而必须编写的所有映射器-那里有许多本来可以避免的代码行。

发生这种情况的部分原因是WCF请求和响应对象应使用[DataContract]进行注释,并使用[DataMember]对其属性进行注释,而MVC则不需要这样做。另一方面,惯用的MVC将需要ViewModel,它们的目标与WCF DataContracts不同。当然,与WCF和MVC冲突相比,使用两组完整的域对象可能与Conway定律有更多关系,但值得指出的是,就输出和输入而言,WCF和MVC具有不同的目标和要求。

就个人而言,我倾向于开发一个简单但功能强大的面向服务的后端API,特别是在您可能需要多个客户端的情况下。我认为,出色的JavaScript MVVM和micro-MVC框架的出现使之成为一种自然的选择,因为使用BackboneJSKnockoutJS等编写应用程序代码可提供功能强大的开发环境。然后,您可以在选择的微型MVC中使用后端来构建Web应用程序,也可以在移动客户端上使用后端,并且您的合作伙伴也可以远程使用相同的API。

建议

WebAPI或Service Stack可能都是构建后端API的理想选择。我建议使用Service Stack,因为最近几个月来我一直在使用它,并且发现它可以替代WCF。我目前正在博客上编写有关服务堆栈的系列教程。

小组维护服务堆栈使用该框架发布了一个示例应用程序,用于开发类似于clone的StackOverflow,它显示了我认为特别引人注目的开发模式。它涉及一个简单的,基于模型的服务后端,您可以想象它被MVC网站,移动应用程序或几乎所有其他内容所消耗。ServiceStack的设计目标显然鼓励一种模式,该模式应减少客户端和服务器之间的耦合。这样做的想法是避免使用诸如GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)减少类方法之类的调用的健谈API 。您可能在服务堆栈中实现相同的操作,如下所示:

[Route("/customers", "GET"]
[Route("/customers/search/{SearchTerm}", "GET"]
[Route("/customers/region/{Region}", "GET"]
[Route("/customers/region/{Region}/search/{SearchTerm}", "GET"]
public class Customers 
{
    public int? RegionId { get; set; }
    public string SearchTerm { get; set; }
}

public class CustomersService : Service
{
    public object Get(Customers request) {
        // handle request
        return new CustomersResponse();
    }
}

的好处,我的眼睛,是不是有出过很多很多不同的方法你的业务逻辑蔓延GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)GetCustomersInRegion(int regionId)GetCustomersWithSearchTerm(string searchTerm)GetCustomers(),这一切都在一个地方。这应该导致更易于维护的代码。

巧合的是,Stack Exchange雇用了原始的Service Stack 作者。他继续积极致力于Service Stack项目。

我特别喜欢某些事情的消息队列-尽管WCF允许这样做,但WebAPI不允许。ServiceStack确实允许通过MQ调用相同的Web服务。有关更多信息,请参见Redis MQ主机,网址为:github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis


注意:ServiceStack允许通过MQ调用相同的Web服务,请参见Redis MQ主机,网址
mythz 2012年

非常感谢@mythz!我不知道
凯尔·霍奇森

但似乎mvc4即将采用网络api路线...这是否使该框架成为“官方赞助”框架?
Xster 2012年

在过去两年中与“官方赞助的框架”(WCF在WebAPI之前)较劲之后,这不再是我选择标准的一部分。这并不是说WebAPI是好是坏,我还没有尝试过。我没有任何愿望,ServiceStack正在解决我的问题。
凯尔·霍奇森

3
这里说的很明显,但是WCF服务的ViewModels和响应对象完全是两个独立的东西。ViewModel可能只是数据的子集,也可能是来自不同来源的数据片段的组合。MVC确实需要为ViewModels提供不同的对象集,而数据来自哪里(无论是WCF还是其他)都无关紧要。另外,还有一个Automapper用于在对象类型之间进行映射,以保存所有X.Name = Y.Name样板代码。
ozz 2012年

4

@tzerb已正确回答了IMO,但我想扩展该答案。您正在寻找的ASP.NET Web API目前处于测试阶段,并且是一个OSS项目。

产品的简短描述如下(从ASP.NET Web API页中引用):

ASP.NET Web API是一个框架,可轻松构建可连接到包括浏览器和移动设备在内的广泛客户端的HTTP服务。ASP.NET Web API是在.NET Framework上构建RESTful应用程序的理想平台。

至于您可能用来使用Web API的客户端应用程序,当然不必一定是ASP.NET应用程序。您可以使用JavaScript通过静态HTML页面使用您的API。您可以使用一些有用的JavaScript库(例如jQuery)轻松完成此操作。

另一方面,您当然可以在任何ASP.NET应用程序的服务器站点上使用您的API。Web API项目还引入了一个名为HttpClient的新HTTP .NET客户端API,可以轻松使用HTTP服务。

通常,这里有一些很好的资源供您入门:

ASP.NET Web API入门-教程,视频,示例

请记住,该项目仍处于测试阶段。我建议您关注Henrik F Nielsen博客,他在博客中发布有关项目的最新未发布更新的信息。您可以在ASP.NET Web Stack项目中找到该项目的源代码和开发流程。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.