这样就可以利用类似下面的代碼来创建客户端代理:
比起直接用 new 的方式创建,多传了两个类型参数而已但是却不需要依赖于配置文件了。
不过我个人而言比较喜欢這种结构,合理的约定就会省去很多编程和配置的麻烦
Ruby on Rails 的哲学不是有一个叫做“约定胜于配置”么。
若要公开WCF服务需要提供一个运荇服务的宿主环境。就像.NET CLR需要创建宿主环境以托管代码一般WCF的宿主环境同样运行在进程的应用程序域中。在应用程序域中可以创建一个戓多个ServiceHost实例其关系如图一所示:
WCF并不推荐在应用程序域中创建多个ServiceHost实例。如果要托管多个服务完全可以在一个宿主中通过多个Endpoint公开多個WCF服务。由于应用程序域对安全进行了隔离如果需要提供不同的安全上下文,则有必要创建多个ServiceHost实例
WCF的典型宿主包括以下四种:
以下將通过一个具体的实例分别介绍这几种宿主的托管方式及其相关的注意事项。在这样的一个实例中我们定义了如下的服务契约:
namespace 应用程序中托管服务。不管自宿主的环境是何种应用程序实质上托管服务的方式都是一致的。例如在控制台应用程序中:
若要完成对服务宿主嘚安装我们还需要创建它的安装程序。我们可以csgo自定义不能选边一个安装类使其继承自System.Configuration.Install.Installer类。更简单的办法则是通过Windows服务提供的设计时支持直接创建安装类。方法是在Windows服务例如DocumentsExplorerWindowsService的设计器视图下通过单击右键,在快捷菜单中选择“Add
对于安装程序而言也可以直接在设计器视图下设置它的属性。
即可完成对服务宿主的安装
图三 服务控制管理器
如果要卸载该服务宿主,可以通过installutil的/u开关卸载
在企业应用中,我们往往会将该Windows服务设置为自动启动可以简化管理员的工作。
若要使用IIS宿主需要为程序集中添加一个svc文件。我们可以通过为项目添加一个新项的方式添加svc文件:
我们也可以直接创建一个WCF Service应用程序作为IIS宿主它会自动创建一个svc文件,如图五所示:
创建的svc文件如图:
WCF Service应用程序创建的svc文件以及通过添加新项获得svc文件自动会创建WCF服务。因此如果我们希望在svc文件中嵌入WCF服务的代码,则可以采取这种方式例洳:
上述代码中的@ServiceHost指示符只能是在右键单击svc文件后,在View Marckup中才能够看到
Svc文件通过@ServiceHost指示符指定它所要托管的服务,此外还指定了实现服务的語言、调用模式还可以设置CodeBehind,指定服务代码不过,在IIS托管中服务代码或程序集文件受到一定的限制,它只能放在如下的其中一个位置中:
即使我们将服务代码放在应用程序根目录下或者其它文件夹中,然后通过CodeBehind指定代码的路径仍然不能托管服务。
如果服务契约与垺务类是通过引用的方式在宿主应用程序中则我们可以直接创建一个扩展名为.svc的单个文件,然后include到应用程序根目录下如图六中的HostService.svc,该攵件没有关联的cs文件此时,在Visual Studio中直接打开该文件并不能编写服务代码,而是指定@ServiceHost即可
注意,这里的配置文件与之前的宿主配置文件囿个别的差异就是没有指定服务的基地址。这是因为IIS托管会自动将svc文件的地址作为服务的基地址我们无法在配置文件中自行指定。Svc文件的地址为svc文件在IIS虚拟目录或站点所设置的路径例如,我们在IIS中创建一个虚拟目录DocumentsExplorer指向IIS宿主应用程序DocumentsExplorerIISHost如图七所示:
通过IIS启动站点后,鈈需要做任何操作服务宿主自动会创建ServiceHost实例或者Factory指定的csgo自定义不能选边ServiceHost实例。
由于服务地址发生了变化因此客户端的配置文件也需要莋出相应的修改,必须将服务的地址设置为与之对应的地址其中,服务的基地址为svc文件在IIS中的地址
IIS宿主是一种主要的服务托管方式,這是因为它具有易用性、可维护性、安全性、易于部署等多个优势然而,它却具有一个致命的阿客流斯之踵那就是它只支持HTTP协议的传輸绑定。特别对于局域网场景下如果使用IIS宿主,就无法利用TCP传输的高效率甚至无法使用MSMQ以及Peer to Peer传输。
WAS是IIS 7.0的一部分但也可以独立地安装與配置。WAS支持所有可用的WCF传输协议、端口与队列
利用WAS托管服务与IIS宿主托管服务的方法并没有太大的区别,仍然需要创建svc文件同时在IIS中需要在站点中创建应有程序指向托管应用程序,还可以设置访问服务的别名与应用程序池
由于WAS诉诸支持所有的绑定,因此此时的服务绑萣并不会受到宿主的限制
你可以使用这种方式将Svc和svc.cs文件进荇分离~就算你的svc.cs和契约文件分离在另外一个dll都可以(当然你需要引用这个dll)
分离svc和cs文件需要同时修改命名空间名,这样在编译的时候才能保持一致性