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的承载。