2014-04-09 1 views
12

thisthis과 같은 게시물을 보았습니다.하지만 몇 년 전의 게시물입니다.WCF 서비스 메서드에서 선택적 매개 변수를 사용할 수 있습니까?

이렇게 할 수 있습니까?

+6

잘 모르겠습니다. 너는 할수 있니? (다른 말로하면 시도해보십시오.) –

+6

@Tom W - 아무 것도 고맙습니다. 시도해 보았지만 작동하는 것처럼 보였습니다. 다니엘 쿠아드라의 도움이 필요하지 않은 답변을 포함하여 어디서나 읽지 않습니다. – BBauer42

답변

29

수 없습니다. 메서드 시그니처와 관련하여 WCF에는 많은 제한이 있습니다. 일부 제한 사항은 호스트 메커니즘 때문에 발생하며, 다른 제한 사항은 WSDL/MEX로 인해 발생합니다.

WCF를 사용하면 서비스 코드 및 오버로드 된 메서드 및 기타 많은 것들에서 기본 매개 변수를 사용할 수 있지만 서비스를 호스팅하거나 시작하거나 시작하거나 시작할 수는 있지만 작동하지 않을 수도 있습니다. 까다 롭습니다.

이 문제를 극복하기 위해 수행 한 작업은 필요한 경우 항상 nullable 매개 변수를 사용하고 내 클라이언트 코드에서 항상 자동 생성 클라이언트 프록시에 액세스 할 수있는 서비스 계층을 사용한다는 것입니다. 내 서비스 계층에는 내가 원하는 모든 과부하 및 선택적 매개 변수가 있습니다. 예 (더러운 코드) :

WCF 서비스 : (내게로 기록되지 자동 생성 된 프록시, 그러나 1)

[OperationContract] 
[FaultContract(typeof(MyCustomFault))] 
List<InventoryPart> SelectMany(string partialPartNumber, string division, int? subDivision, bool? isActive); 

고객 서비스 레이어

public List<InventoryPart> GetParts(string partialPartNumber){ 
    return GetParts(partialPartNumber, null); 
} 

public List<InventoryPart> GetParts(string partialPartNumber, string division){ 
    return GetParts(partialPartNumber, division, null); 
} 

public List<InventoryPart> GetParts(string partialPartNumber, string division, int? subDivision){ 
    return GetParts(partialPartNumber, division, subDivision, null); 
} 

public List<InventoryPart> GetParts(string partialPartNumber, string division, int? subDivision, bool? isActive){ 
    // This method is the one that actually calls the client proxy channels and all. 
} 

내 클라이언트 응용 프로그램 클라이언트 서비스 계층을 소모합니다.

public void LoadPartNumbers(){ 
    var parts = ClientServiceLayer.GetParts(this.txtPartNumber.Text, null, (int) this.cboDivisions.SelectedItem); 
} 
+0

메소드 서명을 추가/변경할 때마다 서비스 참조를 업데이트해야 할 수도 있기 때문에 매번 변경하기가 어렵습니다. 어떤 사람이 회사를 떠났고 새로운 개발자가 들어 오면 어떻게 될까요? –

+0

귀하의 질문을 이해할 수 있는지 잘 모르겠습니다. 이 해결 방법은 기본적으로 WCF 서비스에 단일 범용 메서드 (오버로드 없음)가 있고 클라이언트 서비스 계층에 모든 오버로드가 있고 오버로드 중 하나만 실제로 서비스 참조 자동 생성 프록시 메서드를 호출 함을 의미합니다. – DanielCuadra

관련 문제