代码改变世界

【翻译】WCF Service Application和WCF Service Library的区别

2012-09-12 21:45  imyang  阅读(3009)  评论(0编辑  收藏  举报

最近我在工作中一直用到WCF。一个困惑点就是应该选择哪种类型的工程:WCF Service Application 还是 WCF Service Library。让我们分别看一下,然后检查不同点。希望我们可以总结出一些在不同场景使用的结论。

The WCF Service Application 模板

你在Visual Studio的”添加新项目”对话框中创建WCF Service Application

结果是这样子的:

ATT00003

它的结构和web应用程序很相似,这绝不是巧合。WCF服务的特殊性在于,你拥有服务契约(IService1.cs)、服务实现 (Service1.svc.cs)和web配置文件(web.config)。另外,还有服务托管文件(Service1.svc)。

The WCF Service Library 模板

和Service Application template一样,你可以再Visual Studio的” 添加新项目”对话框里创建WCF Service Library

ATT00005

它会生成一个树形结构如下所示:

ATT00004

和WCF Service Application工程类似,一个服务类库拥有服务契约和服务实现。有app.config文件,而不是web.config配置文件。也没有服务托管文件。

关于app.config文件,MSDN的描述是这样:
Visual Studio的配置是,当它使用 WCF 服务主机 (WcfSvcHost.exe)运行时将 App.config 文件识别为项目的配置文件,这是默认配置。

区别?

如果你对这两个文件做个对比,你会发现代码是一样的。甚至Service Application的web.config和Service Library的app.config也几乎一样(只看<system.serviceModel>节点)。另外,两个工程在编译时都会生成dll文件

或许能区分的最好方法是运行每个工程

首先,运行WCF Service Application,它会像其他web应用一样,给我们"Debugging Not Enabled"的提示:

ATT00007 

继续点击,你会看到默认的目录清单:

ATT00008

点击Service1.svc这个托管文件可以看到真正的服务:

ATT00009

正如我们所预料到的,服务应用程序的运行就像其他web应用一样,实际上,它默认是被ASP.NET部署服务器所托管的:

ATT00010

备注:有一点困惑的是,当运行WCF Service Application(非Service Library)时,我也看到了WCFSvcHost给出的提示

ATT00011

原来是在Service Library工程的选项中设置:

ATT00012

去掉勾选,当我运行了工程中的另外一个工程时,WcfSvcHost不会再出来了。

 

最后的总结

好了,现在我们运行了一下WCF Service Library,看看会发生什么。它不是被development server托管,而是WCF Test Client

ATT00013

为什么是这样子?因为Service Library 工程默认是没有服务托管文件或者web.config文件的。你可以通过增加这些文件来实现,但是这跟创建WCF Service Application没什么区别了,对吗?

让我们回到最开始的问题,不管是选择服务应用还是类库,你仍然需要一个.svc的托管文件(你得为服务类库手动创建),你仍然需要把<system.serviceModel>配置从WCF工程中移到web或者app配置文件中,并且也需要codebehind文件或者dll文件

我能想到唯一使用WCF Service Library的理由就是你想使用一些非IIS的工具进行WCF托管文件,比如windows service。

 

本文翻译自

http://www.itscodingtime.com/post/The-difference-between-Visual-Studios-WCF-Service-Application-and-WCF-Service-Library-project-templates.aspx