首页 > 代码库 > WCF系列之承载(IIS-HTTP)

WCF系列之承载(IIS-HTTP)

IIS承载

部署到IIS的话,需要激活WCF Http Activation功能组件。

下面我们来看一个简单的例子,我们先来看一下项目的目录结构

技术分享

 

该例子实现传入两个整型的参数,返回它们的和。(截图是Surface pro4截出来的,可能字体有点大)

定义契约:

技术分享

实现服务:

技术分享

 

 再来看一下服务的配置:

技术分享

到目前为止,那么服务的定义已经实现了,下面再来看一下怎么在IIS中承载。

首先,我们把项目编译,拷贝bin的目录和svc和配置文件到一个文件夹下。

技术分享

 

在IIS中创建一个网站,目录映射到上面的目录中,启动网站。

技术分享

 

下面验证一下,是否发布成功,在浏览器输入该网站地址,我们可以看到,列出的目录有一个svc文件,我们点击打开这个文件。

技术分享

 

打开之后,得到了下面的界面,那么说明我们服务的承载已经成功。

技术分享

 

 服务已经发布了,那么怎么使用呢,我们继续下面的操作。

用管理员的方式打开VS提供的命令行工具,用svcutil.exe生成调用的客户端代理类和配置。

技术分享

现在我们来创建一个控制台应用程序,把生成的两个拷贝到项目下,得到如下的目录结构。

技术分享

 

好,项目已经完成,先来看一下生成的代码

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")][System.ServiceModel.ServiceContractAttribute(ConfigurationName="ICalculate")]public interface ICalculate{        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICalculate/Add", ReplyAction="http://tempuri.org/ICalculate/AddResponse")]    int Add(int a, int b);        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICalculate/Add", ReplyAction="http://tempuri.org/ICalculate/AddResponse")]    System.Threading.Tasks.Task<int> AddAsync(int a, int b);}[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]public interface ICalculateChannel : ICalculate, System.ServiceModel.IClientChannel{}[System.Diagnostics.DebuggerStepThroughAttribute()][System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]public partial class CalculateClient : System.ServiceModel.ClientBase<ICalculate>, ICalculate{        public CalculateClient()    {    }        public CalculateClient(string endpointConfigurationName) :             base(endpointConfigurationName)    {    }        public CalculateClient(string endpointConfigurationName, string remoteAddress) :             base(endpointConfigurationName, remoteAddress)    {    }        public CalculateClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :             base(endpointConfigurationName, remoteAddress)    {    }        public CalculateClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :             base(binding, remoteAddress)    {    }        public int Add(int a, int b)    {        return base.Channel.Add(a, b);    }        public System.Threading.Tasks.Task<int> AddAsync(int a, int b)    {        return base.Channel.AddAsync(a, b);    }}

我们可以看到,同时生成了同步和异步的两个方法。

 CalculateClient : System.ServiceModel.ClientBase<ICalculate>, ICalculate
服务调用,用了框架的信道调用了远程的服务。

下面再来看一下客户端的配置

技术分享

 

我们来关注一下这两个终结点的配置

<!--提供服务的终结点-->
<endpoint address="WcfService" binding="wsHttpBinding" contract="WcfService.ICalculate" />
<!--提供元数据的终结点-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

第一个终结点用于服务提供,第二个用于终结点元数据发布使用,那么通个这个地址,可以生成客户端的代理代码,我们来看一下,把第一个注释掉看会出现什么情况。

技术分享

然后再来看一下,去掉第二个终结点,依然可以正常访问元数据,用了默认提供的终结点。

技术分享

那么把serverMetadata的httpGetEnabled设置为false或者直接删除,那么会出现这种情况,

技术分享

 那么,去掉这个配置,把第二个终结点配置上,可以正常访问该元数据。

但是元数据的地址就是这样的了。

技术分享

,mex并不是固定的,可以任意命名

 

技术分享

那么对应的地址就是:

技术分享

 

 客户端的调用与本地代码调用的方式一致。

技术分享

 

运行得到的结果:

技术分享

好到现在就完成了WCF服务在IIS的承载。

WCF系列之承载(IIS-HTTP)