Warum ist das Überladen von Methoden in WCF nicht zulässig?


75

Angenommen, dies ist ein ServiceContract

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

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

}

Das Überladen von Methoden ist in C # zulässig, aber WCF erlaubt Ihnen nicht das Überladen. operation contracts Das Hosting-Programm wird eine InvalidOperationExceptionWeile beim Hosting auslösen


13
Ich bin mir nicht sicher, ob dies die richtige Antwort ist, daher werde ich sie als Kommentar veröffentlichen. Ich glaube, das liegt daran, dass WCF so konzipiert ist, dass es mit so vielen Protokollen wie möglich funktioniert, dh auch mit Technologien, die nicht von Microsoft stammen. Überladen ist eine Funktion von .Net und einigen anderen Sprachen, aber nicht allen. Um die Verfügbarkeit von Diensten zu maximieren, ist eine Überlastung nicht zulässig. (Ich denke)
Smudge202

Scheint mir eine gute Antwort zu sein.
Avner Shahar-Kashtan

Antworten:


103

Kurz gesagt, der Grund, warum Sie Methoden nicht überladen können, hängt damit zusammen, dass WSDL nicht dieselben Überladungskonzepte unterstützt, die in C # vorhanden sind. Der folgende Beitrag enthält Details dazu, warum dies nicht möglich ist.

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

Um das Problem zu umgehen, können Sie die NameEigenschaft von explizit angeben OperationContract.

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

    [OperationContract(Name="SumUsingDouble")]
    int Sum(double x, double y);
}

28

Denn wenn Sie über HTTP / SOAP aufrufen und denselben Methodennamen in Ihrem Vertrag haben , können Sie nicht feststellen, welche bestimmte Methode der Client aufrufen soll.

Denken Sie daran, dass beim Aufrufen von Webmethoden über http Argumente optional sind und bei Fehlen mit Standardwerten initialisiert werden. Dies bedeutet, dass der Aufruf beider Methoden über HTTP / SOAP genauso aussehen kann.


1

Der Grund dafür ist, dass WCF von verschiedenen Clients universell verwendet werden soll und diese Clients nicht .NET sein müssen und möglicherweise auch nicht Operator/Method overloadingin ihren Frameworks zugelassen sind. Wenn dies der Fall ist, wird diese Methode von diesen Frameworks unbrauchbar. Um sicherzustellen, dass sie universell einsetzbar ist, lässt WCF dies zu und stellt Ihnen eine Namens-Eigenschaft im OperationContractAttribut zur Verfügung, um einen anderen Namen anzugeben. Wenn der Client ein .NET ist, zeigt WCF ihn automatisch als Methodenüberladung an. Andernfalls wird eine neue Methode mit dem in der Eigenschaft name angegebenen Namen generiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.