• WCF中修改接口或方法名称而不影响客户端程序


    本篇接着"从Web Service和Remoting Service引出WCF服务"中有关WCF的部分。

    运行宿主应用程序。

    运行Web客户端中的网页。

    输入内容,点击按钮,能获取到WCF所提供的服务。

    24

    现在,WCF的接口如下:

    namespace HelloWcf
    
    {
    
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IFirstWcf”。
    
        [ServiceContract]
    
        public interface IFirstWcf
    
        {
    
            [OperationContract]
    
            string GetMessage(string name);
    
        }
    
    }

    修改接口的名称。

    namespace HelloWcf
    
    {
    
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IFirstWcf”。
    
        [ServiceContract]
    
        public interface IFirstWcfChanged
    
        {
    
            [OperationContract]
    
            string GetMessage(string name);
    
        }
    
    }

    接着修改WCF接口实现类。

    namespace HelloWcf
    
    {
    
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“FirstWcf”。
    
        public class FirstWcf : IFirstWcfChanged
    
        {
    
            public string GetMessage(string name)
    
            {
    
                return "Hello " + name;
    
            }
    
        }
    
    }

    重新生成WCF所在的类库。

    再修改宿主应用程序的配置文件,主要修改endpoint节点中的contract属性值。

    ......
    
    <endpoint address="HelloWcf" binding="basicHttpBinding" contract="HelloWcf.IFirstWcfChanged"></endpoint>
    
    <endpoint address="HelloWcf" binding="netTcpBinding" contract="HelloWcf.IFirstWcfChanged"></endpoint>
    
    ......

    重新运行宿主程序。

    重新运行Web客户端,输入内容,点击按钮,程序报错:

    25

    如果每次更改WCF服务,按照目前的情况,会影响到客户端的使用。为此,在WCF的ServiceContract中为我们准备了Name属性,通过此属性可以避免如上问题的发生。

    回到WCF接口,修改如下:

    namespace HelloWcf
    
    {
    
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IFirstWcf”。
    
        [ServiceContract(Name = "IFirstWcf")]
    
        public interface IFirstWcfChanged
    
        {
    
            [OperationContract]
    
            string GetMessage(string name);
    
        }
    
    }

    重新生成WCF所在类库。

    再次运行宿主应用程序。

    再次运行Web客户端,输入内容,点击按钮。

    26

    为什么为ServiceContract增加了Name属性,就不会影响客户端呢?

     

    打开WCF所在的基地址base address。

    27

    点击页面中"http://localhost:9090/?wsdl"这个链接。

    打开的页面列举了WCF服务的元数据,从中,发现了wsdl:portType节点的name属性值是IFirstWcf。

    28

    也就是说,当我们在WCF接口中,通过ServiceContract的Name属性显式设定了值,实际上是设定了WCF元数据中wsdl:portType节点的name属性值。

    总结:当我们希望WCF的接口名、方法名的修改不影响到客户端的使用,就可以通过Name属性显式为接口名、方法名规定一个名称。

  • 相关阅读:
    windows快捷键十八式(win10)
    解决滚动条突然出现导致的页面错位问题
    用命令行撤销工作区的所有更改(修改文件&&新增文件)
    用animation的steps属性制作帧动画
    配置Gitlab pages和Gitlab CI
    zookeeper中的分布式一致性协议
    kafka消息的处理机制(五)
    Paxos算法原理
    kafka同步异步消费和消息的偏移量(四)
    kafka客户端和服务端开发(三)
  • 原文地址:https://www.cnblogs.com/darrenji/p/4638695.html
Copyright © 2020-2023  润新知