2013-06-11 4 views
14

내 인터페이스에 이것을 선언했습니다.WCF 용 인터페이스를 구현할 때 선택적 매개 변수를 사용할 수 없습니다.

[OperationContract] 
[WebGet] 
String GetStuff(String beep, String boop = "too lazy to type"); 

다음과 같이 구현했습니다.

String GetStuff(String beep, String boop = "too lazy to type") { ... } 

내 WCF 서비스로 컴파일되고 업로드됩니다. 그러나 웹 참조로 사용하고 아래 코드를 실행하려고하면 단일 매개 변수의 서명이있는 메서드에 대한 징징 대가 울려 퍼집니다. 마지막 줄이 문제입니다.

어떻게 다음 기본으로을 입력 너무 게으른 할 수 있는가?

ServiceClient client = new ServiceClient(); 
client.GetStuff("blobb", "not lazy"); 
client.GetStuff("blobb"); 
+0

왜 그냥 방법을 과부하, 하나의 방법은 "붑"공급과 다른 전화를 할? – Kippie

+3

WCF로 오버로드가 작동하지 않습니다. –

+0

@HenkHolterman 많은 좋은 답변이 여기에 있습니다. 당신은 좋을 것이고 당신의 간단한 설명을 답으로 써서 녹색으로 확인하십시오. "Def args not supported"는 내 문제에 대한 최선의 답변입니다. :) –

답변

24

간단히 : 기본 인수는 지원되지 않습니다.

의도적으로 그리고 이유가 있습니다. 우리는 WCF 계약을 작성하기 위해 C#을 사용하지만 그것은 표기법입니다. 모든 C# 언어 기능이 SOAP, REST 또는 JSon으로 구현 될 수있는 것은 아닙니다.

14

기능을 오버로드 할 수 있습니다.

[OperationContract] 
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")] 
MyResponse GetData(string filter); 

그런 다음 다른 옵션 대신 여러 매개 변수의 DataContract을 사용하는 것입니다, 그리고 this question 설명처럼, 적절한 DataMember들에 false로 IsRequired을 설정합니다.

1

서비스 참조를 추가 할 때 생성 된 코드를 확인해야합니다. 코드 서명이 WISDL, (슈도)로부터 생성 될 때

:

GetStuff(String , String) 

는 선택적 파라미터에 대해 알지 못하고, 따라서 코드를 생성한다. 그래서 게으르 길 원한다면 생성 된 프록시 클래스를 변경하거나 @Stephen Borg가 제안한 것처럼 함수에 과부하가 걸릴 수 있습니다.

3

단일 매개 변수의 서명을 가진 컴파일러에 대해 우는 소리와 울음 소리가납니다.

시작 부분부터 시작하십시오. 컴파일러는 서비스가 선택적 매개 변수를 기본값으로 인식하지 못하기 때문에 컴파일러가 "우는 소리"를냅니다. 따라서 모든 매개 변수가 필요한 메서드가 노출됩니다. 이 메타 데이터를 기반으로 클라이언트 프록시 ("서비스 참조")를 생성합니다.이 프록시에는 예상되는 방법이 포함되어 있지 않습니다. 서비스가 노출하는 메소드 만 볼 수 있습니다 : (String beep, String boop) 서명이있는 메소드. 그래서 결국 클래스에 존재하지 않는 메서드를 호출하려고하면 컴파일 오류가 발생합니다.

이제 서비스에서이 메서드를 호출하면 클라이언트는 두 값을 모두 제공해야합니다. null을 입력하면 기본 매개 변수의 값을 호출자로 컴파일해야하므로 서비스에 null이 표시됩니다. WCF는이를 지원하지 않으므로 @StephenBorg가 제안한대로 오버로드를 작성하면됩니다.

3

당신은 이런 식으로 작업을 수행 할 수 있습니다

[DataContract] 
public class GetStuffParams 
{ 
    [DataMember] 
    string beep {get; set; } 

    [DataMember] 
    string boop {get; set;} 


    public GetStuffParams() { boop = "too lazy to type"; } 
} 


[OperationContract] 
[WebGet] 
String GetStuff(GetStuffParams stuffParams);