你的位置:首页 > ASP.net教程

[ASP.net教程]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属性显式为接口名、方法名规定一个名称。