6

重複の可能性:
WCFでメソッドをオーバーロードできないのはなぜですか?

私はWCFサービスを使用する1つのプロジェクトに取り組んでいます。私の問題は、WCFサービスで、Display()client1によって使用されるという名前のメソッドが1つあることです。

ここで、同じ名前で1つのパラメーターを持つ別のメソッドを追加します。Display(string name)、新しいclinet2が新しいメソッドを使用でき、古いclient1が古いメソッドを使用できるようにします。どうすればこれを達成できますか?これが私が書いたコードです。

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;
      }
   }
}
4

2 に答える 2

13
    Why WCF doesnot support method overloading directly ?
  • WSDL はメソッドのオーバーロード (OOP ではない) をサポートしていないためです。WCF は、サービスの場所と、サービスが公開する操作またはメソッドを指定する WSDL を生成します。

    WCF use Document/Literal WSDL Style : Microsoft は、soap 本体要素に Web メソッド名が含まれるこの標準を提案しました。

  • 既定では、すべての WCF サービスはドキュメント リテラル標準に準拠しており、soap 本体にメソッド名を含める必要があります。

    唯一の方法は Name 属性を使用することです。たとえば、

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

コンパイラーは以下を生成します。

     [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)
  }
于 2013-01-23T06:49:56.830 に答える
7

OK、コメントが過度に過剰になっているので、これを答えにします。

基本的に次の 2 つのオプションがあります。

  • 単一のインターフェースを使用します(質問で提案したように、インターフェースの継承は技術的にここでは1つのインターフェースとしてカウントされることに注意してください)が、各サービス操作に個別の名前を付ける必要があります。これを行うには、C# メソッドに個別の名前を付けるか、[OperationContract(Name = "distinctname")]属性を適用します。

  • 2 つの別個のインターフェースを使用し、それらの間に継承関係がなく、それぞれを異なるエンドポイントで公開します。次に、それぞれにサービス操作を含めることができます。名前は同じですが、パラメーターは異なります。もちろん、必要に応じて、1 つの実装クラスで両方のインターフェイスを実装することもできます。

于 2013-01-23T06:28:08.963 に答える