zoukankan      html  css  js  c++  java
  • 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的承载。

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/hunter2014/p/5863223.html
Copyright © 2011-2022 走看看