WCF服务编程(1)——IIS上托管服务





一、引言

IIS web服务器是WCF服务托管最常见的一种方式之一,它的优势在于宿主进程可以在客户端第一次请求时就自动进行启动,但是它的不足之处在于只能使用http协议。

VS中我们创建IIS托管的WCF服务很简单,直接从文件->新建->项目->WCF服务应用程序,其默认添加的就是IIS托管的WCF服务应用程序。

图片1.jpg 

 

二、IIS托管的两种发布服务的方式

IIS托管WCF服务有两种发布服务的方式,分别是利用.svc文件发布和利用web.config发布,下面分别介绍这两种发布方式。

2.1 利用.svc文件进行发布

.svc文件内容如下所示:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.Service1" CodeBehind="Service1.svc.cs" %>

ServiceHost代表一个用于进行托管的服务宿主对象,Language是后端代码采用的语言,这里采用的是C#语言,Service关联了服务类的名称(要带上命名空间),比如,我们定义的服务类就叫做Service1 :

public class Service1 : IService1
{
 
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
 
    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}


CodeBehind后面就是我们定义的服务类所在的文件路径。上述配置发布的服务名称就是http://localhost:24673/Service1.svc,其中Service1.svc就是我们配置服务的.svc文件的名称,端口号是VS随机分配的,如果我们修改了这个文件的名称,那么相应的服务名也会修改。比如将Service1.svc改成Service2.svc,那么服务名就会变成http://localhost:24673/Service2.svc

图片2.png 

2.2 利用Web.config进行发布

除了在.svc文件中配置服务之外,我们也可以在Web.Config中配置相应的WCF服务。比如,在Web.config中有以下的配置:

 <system.serviceModel>
    <services>
      <service name="WcfService2.Service1">
 
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" >
      <serviceActivations>
        <add relativeAddress="Service1.svc" service="WcfService2.Service1"/>
      </serviceActivations>
    </serviceHostingEnvironment>
    ......
  </system.serviceModel>


service 标签中配置的即为我们的服务类Service1,而在serviceActivations中add标签就是增加了一个服务的相对地址Service1.svc,完整的服务地址就是:http://localhost:24673/Service1.svc。 配置完成web.config之后,我们可以将.svc文件清空,但是不能删除,相对地址里面的.svc文件名称需要和本地文件名称一致,这样才能正常启动服务。 

上述就是两种不同的发布WCF服务的方式,两者的有限级顺序是.svc发布方式大于Web.config发布方式,也就是说一旦在.svc中配置了相应的服务,在Web.config中配置是无效的。

三、一些常用的服务配置

3.1修改契约接口和方法契约的别名

我们知道一般情况下,我们自己编写的服务类都继承了契约接口并实现了方法契约,在契约接口和方法契约定义时我们是能够为服务和方法起别名的,如下面所示我们在起别名之前契约接口名称和方法名称分别叫IService1和GetData:

 

[ServiceContract]
public interface IService1
{
 
    [OperationContract]
    string GetData(int value);
 
    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
            
}


同时我们看到在发布的服务类名称中服务类和方法也分别叫做IService1和GetData:

图片3.png 

现在利用契约中的Name属性给契约接口和契约方法分别起别名:

[ServiceContract(Name = "OtherIService1")]
public interface IService1
{
 
    [OperationContract(Name = "OtherGetData")]
    string GetData(int value);
 
    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
 
}


相应的发布的服务也得到了修改:

图片4.png 

 

四、IIS托管的WCF服务的发布

类似于Asp.net网站的发布,我们在IIS上发布WCF服务时步骤也基本一致。

(1)在IIS服务管理器中,我们新建一个应用程序,名称就叫WcfTest:

图片5.png 

(2) 将WcfTest中的虚拟目录指向我们程序生成目录中bin目录的上一级。

(3) 我们可以看到,在bin目录下,生成了一个名叫WcfService2.dll的插件,这就是我们编写的服务所在的插件。

按照上述部署好之后,我们在WCF客户端添加对应的服务时,IIS会自动启动该服务,而不需我们手动进行启动。

 

 

 






评论