2012-04-23 4 views
63

Załóżmy, że jest to ServiceContractDlaczego metoda przeciążania nie jest dozwolona w WCF?

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

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

} 

Metoda przeciążenie jest dozwolone w C#, ale WCF nie pozwala na przeciążenie operation contracts Program gospodarzem wygeneruje InvalidOperationException natomiast gospodarzem

+10

Nie jestem pewien, czy to jest odpowiedź "prawidłowa_", więc opublikuję ją jako komentarz. Sądzę, że dzieje się tak dlatego, że WCF został zaprojektowany do pracy z tak wieloma protokołami, jak to możliwe, tj. Również z technologiami innych firm. Przeciążanie to funkcja programu .Net i kilku innych języków, ale nie wszystkie. Aby zmaksymalizować dostępność usług, przeciążanie jest niedozwolone. (Myślę) – Smudge202

+0

Wydaje mi się, że to dobra odpowiedź. –

+0

@Simiman ładna uwaga oślizgła –

Odpowiedz

90

W skrócie, powód, dla którego nie można przeciążać metod, ma związek z tym, że WSDL nie obsługuje tych samych koncepcji przeciążania, które występują w języku C#. Poniższy post zawiera szczegółowe informacje o tym, dlaczego nie jest to możliwe.

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

Aby obejść ten problem, można jednoznacznie określić właściwość OperationContractName.

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

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

Bo gdy powołując się na HTTP/SOAP, mając taka sama nazwa metody w umowie oznaczałoby, że nie ma sposobu, aby określić, który konkretny sposób klient ma zamiar powołać.

Należy pamiętać, że podczas wywoływania metod WWW po http argumenty są opcjonalne i są inicjowane z wartościami domyślnymi, jeśli ich nie ma. Oznacza to, że wywołanie obu metod może wyglądać dokładnie tak samo przez HTTP/SOAP.