WCF系列之承载(IISHTTP) 牧羊人

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

原文地址:https://www.cnblogs.com/hunter2014/p/5863223.html