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

  • 相关阅读:
    Redis安装(源码安装)
    为 Blade 模板引擎添加新文件扩展名
    使用国内镜像composer安装laravel
    从github上下载项目到eclipse
    js中使用Java的方式
    File类中的list()和listFiles()方法
    与文件上传到的三个类:FileItem类、ServletFileUpload 类、DiskFileItemFactory类
    DiskFileItemFactory类
    如何获取.properties配置文件
    Linux、Windows中的相对路径和绝对路径
  • 原文地址:https://www.cnblogs.com/hunter2014/p/5863223.html
Copyright © 2020-2023  润新知