2009-10-25 2 views
0

간단히 말해서 : 웹 서버에서 저장 프로 시저를 호출하는 winform-app 용 wcf 서비스를 작성하려고합니다. 지금까지 아무 문제 - 내 서비스는 방법 "execStp (문자열 nameOfStoredProcedure, stpParamList parameterList에)"을 노출하지wcf 서비스 클래스에 의해 노출 된 도우미 클래스의 호출 메서드

[OperationContract] 
     int execStp(string stpName, srsWcfLib.Utilities.stpParamList paramList); 
stpParamList는 기본적으로의 이름/값 쌍을 보유하고 세 번째 클래스 stpParams의 다른 클래스 개최를 (이다

목록에 매개 변수를 추가하려면 SqlParameter에, 나는 두 번째 클래스의 방법을 썼다

public void addParameter(string ParamName, object ParamValue) 
     { 
      this._Parameters.Add(new stpParam(ParamName, ParamValue)); 
     } 
List<stpParam> _Parameters = new List<stpParam>(); 

    [DataMember] 
    public List<stpParam> Parameters 
    { 
     get { return _Parameters; } 
     set { _Parameters = value; } 
    } 

윈 - 응용 프로그램의 목록 클래스의 인스턴스를

stpParamList stpParams = new stpParamList(); 

내가 stpParams.Parameters에 액세스 할 수 있습니다,하지만 난 (분명히) 무엇을 놓치고하지 stpParams.addParameter (name, value);

...?

는 는 라인 하르트

답변

3

WCF는 클라이언트의 속성이 아닌 기능을 통해 제공, 감사합니다. 나는 그들이 사용하는 용어를 잊어 버렸지 만, 기본적으로 속성/필드 덤프를 통해 전송됩니다.

이 문제를 해결하려면 클라이언트에서 동일한 Entity 라이브러리를 참조하고 "WCF 서비스 구성"에서 해당 라이브러리에 대한 "재사용 참조"를 선택하십시오.

2

에리히 (Erich)가 머리에 문제를 못 박았습니다. WCF는 MESSAGE 기반 전송 시스템입니다. 당신은 객체의 직렬화 된 메시지를 전송할 것입니다. 추가 기능이있는 서버 측 객체는 XML 또는 클라이언트 측 와이어를 통해 전송되는 바이너리 형식으로 직렬화됩니다.

클라이언트는 서비스에서 공개 한 XSD (XML 스키마) 파일 만 처리 할 수 ​​있습니다. 클라이언트는 동일한 "데이터 서명"을 가진 클라이언트 측 클래스를 만듭니다. 즉, 동일한 필드, 동일한 이름과 유형을 사용하지만 서버 측 코드에있는 모든 함수 및/또는 메소드를 마술처럼 재현 할 수는 없습니다. 메시지 (텍스트 또는 바이너리)를 클래스의 데이터 전용 표현으로 다시 deserialize하면됩니다.

이것은 버그 또는 바인딩 문제가 아닙니다. 이것은 WCF의 기본 설계 선택 사항입니다. 클라이언트와 서버 간의 유일한 연결은 직렬화 된 메시지로 XML 스키마에서 표현할 수있는 모든 것입니다. 행복하게 데이터를 직렬화하고 역 직렬화 할 것이지만 코드/동작을 옮길 수는 없습니다. 당신은 이 아닙니다.은 정상적인 함수 호출과 같이 실제 객체를 참조로 전달합니다. WCF 런타임은 매개 변수를 XML로 직렬화하여 전송합니다.

이제 와이어 양끝을 조정하면 (예 : 클라이언트와 서버 모두 SOA 원리를 조금 위반하는 방법이 있습니다 (그러나 유용 할 수 있습니다). 서비스 계약과 데이터 계약을 별도의 어셈블리 Contracts.dll (클래스 라이브러리)에 넣은 다음 서버 측과 클라이언트 측에서 참조하면 사실상 모든 .NET Framework 유형이 공통된 .NET 유형 srsWcfLib.Utilities.stpParamList을 공유 할 수 있습니다. 그러나 이러한 경우에는 클라이언트 측에서 좀 더 많은 작업을 수행하고 클라이언트 프록시를 코드로 수동으로 인스턴스화해야합니다 (Visual Studio 또는 svcutil에서 클라이언트 프록시를 만드는 대신). 공유 계약 어셈블리를 만들고 클라이언트 유형 클래스를 만드는 대신 직접 유형을 사용합니다.

마크

+0

우수한 게시물, 정교하게 감사드립니다! – Erich

+0

해명 해 주셔서 감사합니다. 당신이 알게 되겠지만 나는 WCF를 처음 접했지만 두 답변 모두 많은 도움이되었습니다! 라인 하르트 – Reinhard

관련 문제