76

これがServiceContract

[ServiceContract]
public interface MyService
{
    [OperationContract]
    int Sum(int x, int y);

    [OperationContract]
    int Sum(double x, double y);

}

C# ではメソッドのオーバーロードが許可されていますが、operation contracts WCFではオーバーロードが許可されていません。InvalidOperationException

4

3 に答える 3

105

簡単に言えば、メソッドをオーバーロードできない理由は、C# 内に存在する同じオーバーロードの概念を WSDL がサポートしていないという事実に関係しています。次の投稿では、これが不可能な理由について詳しく説明しています。

http://jeffbarnes.net/blog/post/2006/09/21/Overloading-Methods-in-WCF.aspx

この問題を回避するには、 のNameプロパティを明示的に指定しますOperationContract

[ServiceContract]
public interface MyService
{
    [OperationContract(Name="SumUsingInt")]
    int Sum(int x, int y);

    [OperationContract(Name="SumUsingDouble")]
    int Sum(double x, double y);
}
于 2012-04-23T07:05:32.543 に答える
28

HTTP/SOAP を介して呼び出す場合、コントラクトに同じメソッド名があると、クライアントがどの特定のメソッドを呼び出そうとしているかを判断する方法がないためです。

http 経由で Web メソッドを呼び出す場合、引数はオプションであり、欠落している場合はデフォルト値で初期化されることに注意してください。これは、両方のメソッドの呼び出しが HTTP/SOAP 上でまったく同じように見えることを意味します。

于 2012-04-23T07:07:44.167 に答える
1

Operator/Method overloadingその理由は、WCF はさまざまなクライアントで普遍的に使用できると想定されており、それらのクライアントは .NET である必要はなく、フレームワークでも許可されない可能性があるためです。その場合、このメソッドはこれらのフレームワークで使用できなくなります。そのため、WCF は、それを普遍的に使用できるようにするためにOperationContract、別の名前を指定する属性の名前プロパティを許可せずに提供します。クライアントが .NET の場合、WCF はそれをメソッド オーバーロードとして自動的に表示しますが、それ以外の場合は、name プロパティで指定された名前で新しいメソッドを生成します。

于 2019-10-02T11:36:01.113 に答える