然而,如果作为最终产品部署,自托管的寄宿方式就不那么合适,应用程序相比框架(IIS、Windows服务等)是不稳定的,WCF与应用程序共享生命周期,应用程序关闭后WCF也会停止。还有许多特性诸如进程回收、空闲关闭等自托管都是不支持的。因此,为了使我们的WCF符合产品级别的要求,应该为其选择一个更稳定、伸缩性更好的宿主。
我们今天先学习在IIS中寄宿,记住,IIS寄宿只支持http协议的绑定。在IIS中寄宿,需要IIS5.1或更高版本的支持,IIS会为我们管理ServiceHost,同时为我们提供进程回收、空闲关闭、进程运行状况监视等特性支持,我们只需要把服务相关的文件按照一定的组织方法放入IIS的托管中,IIS会为我们管理一切。这种托管受到支持的系统很多,从Windows XP SP2 到 WIndows Server 2008,所以它非常流行。然而也有缺点,它只能接受http协议的绑定,对于tcp、管道、MSMQ都是不支持的。
今天的目标:完全手写一个寄存于IIS的服务。
(1)首先,新建一个文件夹,我取名为IISService。
(2)打开IIS管理器,在默认网站节点上点击右键->添加应用程序,为应用程序指定一个别名,这个可以随意起的,这个名字将成为将来服务地址的一部分,我把它起作IISService,物理路径就选择我们刚才建立的文件夹。
(3)建立服务文件。在VS2015中新建一个文本文件,并另存为HelloWCF.svc,路径即为刚才新建的文件夹。
内容为:
<%@ServiceHost
language=c#
Debug="true"
Service="LearnWCF.HelloWCF"
%>
被<%%>框住的表示这个是一个服务器端包含,@ServiceHost 标签表示这是个WCF的服务。language=c# 表示我们用C#语言来写代码,Debug=true顾名思义了,最主要的是Service这个属性,他表示这个服务的实现类是什么,这里要用完全限定名,即要包括命名空间。
(4)编写定义服务的类文件。首先在IISService文件夹中新建文件夹取名为App_code。然后还是在VS2015中新建一个文本文件,并另存为HelloWCF.cs,路径即为App_code内。实现内容为:
using System;
using System.ServiceModel;
namespace LearnWCF
{
[ServiceContract]
public interface IHelloWCF
{
[OperationContract]
string PHelloWCF();
}
public class HelloWCF : IHelloWCF
{
public string PHelloWCF()
{
return "Hello WCF!";
}
}
}
这代码应该很熟悉了。
(5)编写配置文件。打开VS2015新建文本文档,另存为web.config,路径为IISService文件夹。内容为:
<configuration>
<system.serviceModel>
<services>
<service name="LearnWCF.HelloWCF" behaviorConfiguration="metaExchange">
<endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metaExchange">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
该配置文件有些许变化。一是没有基地址了,因为寄存于IIS中了,基地址为: http://localhost/IISService/HelloWCFService.svc ;二是服务器终结点地址为空字符,这表示使用服务基地址表示终结点地址(这里也可以使用相对地址,但不能用绝对地址)。
(6)搭建完成后,就表示服务在IIS中寄存完成,只要IIS服务开启,那么就可以在页面中输入服务地址(http://localhost/IISService/HelloWCFService.svc)就可以和之前两次一样查看服务信息,如图。
总结:
这一篇我们学习了如何在IIS中寄宿WCF服务,必备的要素总结如下几点:
(1) 建立IIS应用程序及物理路径
(2) 在应用程序路径下建立XXX.svc文件用于声明WCF入口和服务地址导航
(3) 在应用程序路径的子目录App_Code下建立XXX.cs文件用于定义和实现服务协定
(4) 在应用程序路径下建立web.config 用于配置服务。
(5) 保持IIS为启动状态。
出现的问题:
HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。