2009-07-24 4 views
1

웹 서비스로 데이터를 보유하기위한 클래스의 '공통'라이브러리를 공유하는 대형 관리자 winforms 응용 프로그램을 상속 받았습니다. 내가 가지고있는 문제는 웹 서비스 호출에서 클래스의 채워진 인스턴스를 반환하면 클라이언트에서 다른 유형으로 나오고 다른 '공통'프로젝트 로직을 사용하여 조작 할 수 없다는 것입니다.winforms 클라이언트와 웹 서비스간에 공통 클래스를 사용하려면 어떻게해야합니까?

웹 서비스가 Common.Widget 유형의 객체를 반환하더라도 와이어를 통해 전송하기 위해 해당 객체를 래핑합니다. 이 작업이 완료되면 .Net이 InvalidCastException을 throw하기 때문에 개체를 다시 '일반적인'형식으로 캐스팅 할 수 없습니다.

WCF 및 DataMember 특성을 사용하여이 작업을 수행했지만이 프로젝트를 WCF로 업그레이드 할 수 없습니다.이 작업은 매우 커서 테스트 서버는 Win2K입니다 (Win2K에서는 .Net 3+ 없음).

이렇게 쉽게 할 수있는 방법이 있습니까? 아니면 웹 서비스에서 가져온 모든 데이터를 공용 라이브러리의 원시 형식으로 다시 변환해야합니까? 사전에

감사

라이언

답변

2

이것이 원래 의도 된 방식입니다.

코드가 작동중인 경우 이러한 유형 중 하나를 반환 할 때 현재 어떤 작업을 수행합니까? ASMX 웹 서비스가 어떻게 동작 하는지를 번역해야합니다.

+0

모든 개체를 다소 불쾌한 방식으로 다시 만들고 코드는 스파 스 테이며 인스턴스가 웹 서비스인지 또는 공통인지 여부를 확인할 수 없습니다. WCF로 마이그레이션 할 때까지 컬렉션 등의 수동 번역을 할 것입니다. 감사합니다. –

0

나는이보다 더 좋은 방법이 좋겠지 만 : 당신은 당신의 웹 서비스와 일반 라이브러리를 포함하는 경우, 다음의 객체를 반환하는 웹 서비스를 정의 두 환경 (예 : Widget 클래스)에서 사용할 유형을 선택하면 winforms 클라이언트에서 Widget 유형의 객체를 사용할 수 있습니다. 두 프로젝트 모두에서 Common 라이브러리를 포함하고 있기 때문에 캐스팅 예외가 발생했다고 생각합니다. 동일한 이름을 사용하더라도 winforms 앱은 Common을 웹 서비스의 Common과 다른 자체 프로젝트로 취급합니다 .

위에서 언급 한 접근법 (웹 서비스에서만 Common 포함)을 사용하면 웹 서비스에서 온 것이 아니더라도 winforms 응용 프로그램에서 Common 객체를 사용할 수 있습니다. 즉, "new "키워드).

0

개체가 유선 위에있을 때 웹 서비스의 프록시에 전용 인 클래스로 deserialize됩니다. 따라서 클래스 이름이 같더라도 별도의 클래스입니다. 그리고 Visual Studio에서 F12를 사용하는 경우 웹 서비스의 클래스에는 "공통"프로젝트의 클래스에 대한 모든 메서드가 없다는 것을 알 수 있습니다.