设为首页 收藏本站
查看: 909|回复: 0

[经验分享] IIS无SVC文件托管WCF服务

[复制链接]

尚未签到

发表于 2015-8-14 11:07:39 | 显示全部楼层 |阅读模式
  【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的版本配置如图所示:

  

DSC0000.gif   
  【6.4】运行结果
  这里直接启动IE,可以在浏览器里查看到服务的信息。如果启用服务元数据页面,可以查看到服务的WSDL信息。页面如下:
DSC0001.gif
  【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
  参考资料:
  1.<serviceActivations>:http://msdn.microsoft.com/zh-cn/library/ee816902(en-us,VS.100).aspx
  2.http://developer.iyunv.com/art/201002/185243.htm
  3.http://msdn.microsoft.com/zh-cn/library/system.servicemodel.dispatcher.channeldispatcher.aspx
  4.《WCF技术内幕》:通道分发器

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-98888-1-1.html 上篇帖子: 解决IIS启动错误一例- 下篇帖子: 【解决方法】IIS 承载的服务失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表