如何在WCF中使用两个具有相同名称的方法?

时间:2013-01-23 05:16:01

标签: c# .net wcf

  

可能重复:
  why you cant overload a method in WCF?

我正在开发一个使用WCF服务的项目。我的问题是,在wcf服务中我有一个名为“Display()”的方法,我使用client1。现在我想添加另一个具有相同名称但有一个参数的方法,即。 “显示(字符串名称)”,以便新的clinet2可以使用新方法,而旧的client1可以使用旧方法。我怎样才能做到这一点。这是我写的代码。提前10Q。

namespace ContractVersioningService
{
  [ServiceContract]
  public interface IService1 
  {
    [OperationContract]
    string Display();

    [OperationContract]
    string GoodNight();
  }     
}

namespace ContractVersioningService
{
   public class Service1 : IService1
   {
     public string Display()
     {
        return "Good Morning";          
     }

     public string GoodNight()
     {
        return "Good Night";
     }
   }
}    

namespace ContractVersioningService
{
  [ServiceContract(Namespace = "ContractVersioningService/01", Name =      "ServiceVersioning")]
  public interface IService2 : IService1
  {
     [OperationContract]
     string Disp(string greet);
  }
}

namespace ContractVersioningService
{

   public class Service2 : Service1, IService2
   {
      public string Display(string name)
      {
         return name;
      }

      public string Disp(string s)
      {
         return s;
      }
   }
}

2 个答案:

答案 0 :(得分:12)

    Why WCF doesnot support method overloading directly ?
  • 因为WSDL不支持方法重载(不是OOP)。 WCF生成WSDL,它指定服务的位置以及服务公开的操作。

    WCF使用Document / Literal WSDL样式:Microsoft提出了这个标准,其中soap body元素将包含Web方法名称。

  • 默认情况下,所有WCF服务都符合文档文字标准,其中soap正文应包含方法名称。

    唯一的方法是使用Name属性。例如,

        [OperationContract(Name="Integers")]
        int Display(int a,int b)
        [OperationContract(Name="Doubles")]
        double Display(double a,double b)
    

编译器将生成以下内容,这对于wsdl定位

是有意义的
     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName=
    "ServiceRef.IService1")]
  public interface IService1
   {
       [System.ServiceModel.OperationContractAttribute(
       Action="http://tempuri.org/Service1/AddNumber",
       ReplyAction="http://tempuri.org/IHelloWorld/IntegersResponse")]                   
       int Display(int a,int b)

       [System.ServiceModel.OperationContractAttribute(
       Action="http://tempuri.org/IHelloWorld/ConcatenateStrings",
       ReplyAction="http://tempuri.org/Service1/DoublesResponse")]
       double Display(double a,double b)
  }

答案 1 :(得分:7)

好的,我打算回答这个问题,因为现在评论过多了。

您基本上有两个选择:

  • 使用单个界面(请注意,界面继承,就像您在问题中建议的那样,在技术上计为一个界面),但是必须为每个服务操作赋予不同的名称。您可以通过命名C#方法distinct或应用[OperationContract(Name = "distinctname")]属性来执行此操作。

  • 使用两个单独的接口,它们之间没有任何继承关系,在不同的端点上发布每个接口。然后,您可以在每个服务操作中使用相同的名称,但具有不同的参数。如果您愿意/需要,您仍然可以使用一个实现类实现这两个接口。