WCF4.0新特性体验(7):IIS无SVC文件托管WCF服务(IIS hosting without an SVC file )

简介:
    今天我来继续学习WCF4.0新特性体验(7):IIS无SVC文件托管WCF服务(IIS hosting without an SVC file )。这个是在WCF4.0中提供的一个新特性。在这一节里,我会介绍WCF服务实例化的机制,其中介绍两个主要的类型通道分发器和服务宿(ChannelDispatcher和ServiceHost)。它们与服务激活的关系。最后给出详细的开发过程。
【1】基本概念:
   Fileless Hosting也就是IIS hosting WCF Service without an SVC file ,中文意思,也就是无svc文件托管WCF服务。
【2】服务实例化:
  我们知道在4.0之前的版本,创建IIS托管的WCF服务程序,默认都会生成一个对应的svc文件。这个和Asp.net Web服务的ASMX文件作用类似,也就是设置一些重要的功能,比如code-behind.代码后置。在svc文件里,我们可以看到一些主要的信息:
<%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>
   上面的声明通知 .svc 处理程序要在哪个类中查找 WebMethod,该处理程序就会神奇地处理其余所有事情。例如,假设虚拟目录的名称为 'service1',它包含'service1'.svc 以及一个包含该程序集的 bin 子目录。 
【3】通道分发器:
  这里一个重要的类型就是通道分发器ChannelDispatcher,它会负责把特定的消息与服务实例关联起来,并发特定的消息转发给服务实例。
  • 使用绑定创建通道侦听器
  • 管理通道侦听器上的通道
  • 管理侦听工作
  • 管理通道侦听器和通道堆栈
  • 控制从通道堆栈接收消息的节奏(也称作限流throttling
  • 管理服务实例的创建、生命周期和数量
  • 路由消息到特定的服务实例
  • 把接收的消息反序列化为特定的对象
  • 使用这个对象来调用服务实例上的方法
  • 序列化返回结果到应答消息里
  • 路由应答消息到特定的通道堆栈,然后通过通道堆栈发送给客户端
  • 处理以上任务异常
  • 管理以上任务默认和指定的执行行为
【4】 ServiceHost 类型
  ChannelDispatcher、EndpointDispatcher、DispatchRuntime和DispatchOperation类型不可以在ServiceHost 或ServiceHostBase的实例上下文环境之外使用。事实上,如果我们尝试单独使用的话,ChannelDispatcher会抛出一个InvalidOperationException异常。在接收程序里,ServiceHost位于调用堆栈的顶部,而且它封装了ChannelDispatcher、EndpointDispatcher、DispatchRuntime和DispatchOperation类型的复杂性。ServiceHost类型定义了一个容易使用的API,它简化了侦听终结点的工作。在运行时,ServiceHost类型最终要调用通道侦听器、通道堆栈、ChannelDispatcher、EndpointDispatcher、DispatchRuntime和DispatchOperation。本质上,ServiceHost类型借助本书里介绍的类型来构造一个完整的消息接收程序,因此,开发者不需要再去实现复杂的底层机制。
【5】无svc文件服务激活的原理:
  在WCF4.0里,通过提供一种虚拟的服务类型映射机制来实现WCF服务的激活。我们可以在配置文件里指定服务类型和相对地址之间的映射关系。这就使得我们可以在不是要.svc文件的情况下,在WAS/IIS里托管WCF服务程序。
  关于服务激活,这里一个重要的类型就是serviceActivation。我们可以定义服务类型和相对地址之间的映射关系。在配置文件里serviceActivations节点属于serviceHostingEnvironment>。一个简单的服务类型和相对地址之间的映射如下:
 
  
<configuration>    <system.serviceModel>        <serviceHostingEnvironment>            <serviceActivations>                <add relativeAddress="MyService.svc" service="MyService"/>            </serviceActivations>        </serviceHostingEnvironment>    </system.serviceModel></configuration>
  使用这个配置,我们就可以在WCF4.0里,无svc文件激活MyService.
注意 < serviceHostingEnvironment >属于一个应用程序级别的配置。我们必须把它放置在<system.serviceModel>
节点下。此外,serviceHostingEnvironment继承自machinetoApplication。如果我们在machine注册单个服务,程序里的每个服务必须继承该服务。

Configuration-based activation supports activation over both http and non-http protocol. It requires extensions in the relatativeAddress i.e. .svc, .xoml or .xamlx. You can map your own extensions to the know buildProviders, which will then enable you to activate service over any extension. Upon conflict, the  <serviceActivations> section overrides .svc registrations.
  这种通过配置设置的激活映射,支持http和非http协议。我们需要在相对地址relatativeAddress 里扩展文件名,例如.svc、.xoml 或.xamlx。我们也可以定义自己的处理扩展组件,然后在这里配置,那么WCF也会做类似的映射。为了避免冲突,我们在配置文件里定义的 <serviceActivations>会代替svc的内容。也就是配置文件的设置优先级会比较高。
【6】开发过程详解:
【6.1】创建一个WCF服务项目:
  这里就是用Visual Studio直接创建一个默认的WCF服务程序,也就是IIS托管的项目类型。服务契约和服务类型的定义非常简单:
public class Service : IService 

        public void DoWork() 
        { 
        } 

[ServiceContract] 
public interface IService 

        [OperationContract] 
        void DoWork(); 

 这里默认WCF会创建一个附加的svc文件。我们这里手动删除。
【6.2】配置服务激活选项:
这里要配置服务激活相关的选项:
        
<serviceHostingEnvironment> 
    <serviceActivations> 
        <add relativeAddress="Service.svc" service="Service" /> 
         </serviceActivations> 
</serviceHostingEnvironment> 
  relativeAddress是相对地址, service是我们定义的服务的名字,记住这里不要把 service设置为契约名字,否则会出现错误。
【6.3】IIS部署:
     这里我们使用的是IIS6(IIS7的部署可能存在差别,但是基本操作是类似的),来部署WCF服务,过程很简单。
  • 编译,并发布WCF服务程序。
  • 建立一个新的网站,或者新的虚拟目录,选择WCF文件所在的目录。
  • 设定目录的执行权限。以及其它的一些操作。这些和部署其它的网站类似。
  • 指定网站的ASP.NET的版本,这里注意版本为4.0,默认的版本是2.0。
     网站ASP.NET的版本配置如图所示:
【6.4】运行结果
  这里直接启动IE,可以在浏览器里查看到服务的信息。如果启用服务元数据页面,可以查看到服务的WSDL信息。页面如下: 
【7】总结
  1)IIS7托管的时候,记住要指定WCF Handle。
  2)这里对于IIS支持,IIS6目前只支持,http绑定,而对于IIS7,可以利用WAS支持其它的非Http绑定。
  3)IIS托管的时候,注意指定ASP.NET的版本:4,不是2.0,不然会出错误。
  4)最后给出例子代码,共大家参考: /Files/frank_xl/8.FileLessHost.zip
参考资料:
4.《WCF技术内幕》:通道分发器

 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320276 ,如需转载请自行联系原作者




相关文章
|
3月前
|
网络协议 文件存储 数据安全/隐私保护
【搭建服务器】Win10 IIS搭建webdav服务以及公网访问教程 - 挂载webdav
【搭建服务器】Win10 IIS搭建webdav服务以及公网访问教程 - 挂载webdav
|
9月前
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
5月前
|
开发框架 .NET Apache
windows安装IIS服务
windows安装IIS服务
36 0
|
5月前
发布在IIS的apk或者ipa文件无法访问
发布在IIS的apk或者ipa文件无法访问
71 0
|
6月前
|
C# Windows
C#建立最简单的web服务,无需IIS
C#建立最简单的web服务,无需IIS
|
8月前
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
38 0
|
8月前
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
57 0
|
8月前
|
XML 数据格式 Windows
IIS服务启动提示当文件已存在时,无法创建该文件,183
IIS服务启动提示当文件已存在时,无法创建该文件,183
232 0
Visual Studio 2022 创建 WCF服务 找不到
Visual Studio 2022 创建 WCF服务 找不到
|
9月前
|
开发框架 .NET
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"