2009-10-21 3 views
2

WCF를 사용하여 C#에서 일부 wsdl 및 클라이언트 우선 개발을 수행하고 있습니다 (wsdl 및 클라이언트는 이미 존재하며 서버 측은 구축 중입니다). 나는 이상한 문제가있다. wsdl.exe를 사용하여 .wsdl에서 계약서를 생성했으며 WCF 서비스를 빌드하고 Windows 서비스로 호스트 할 수있었습니다. 그러나 wsdl.exe에서 생성 한 WCF 서비스로 wsdl의 비공개 필드를 표시합니다.

, 나는 http://localhost/Service?wsdl에서 얻을 WSDL 대신 공용 속성의 private 필드를 노출 (예 : 대신 OsType의 나는 대중 OsType 속성과 연결된 전용 변수 인 m_OsTypeField를 얻을.) 여기

있습니다 이 문제가있는 클래스 중 하나에 대한 속성입니다.[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://xxxxxxx.com/")]

.NET XML serializer는 모든 비공개 멤버를 무시하기 때문에 완전히 혼란 스럽습니다. 이것이 일어날 수있는 이유에 대한 아이디어가 있습니까?

답변

2

WCF를 사용하는 경우 wsdl.exe 대신 svcutil.exe을 사용해서는 안됩니다.

또한 표준 WCF DataContract serializer는 [DataMember] 특성으로 표시된 항목을 행복하게 serialize합니다. .NET 가시성 설정은 실제로 SOA보기에 영향을주지 않습니다.

그러나 코드 샘플에서는 DataSourceCaseizer가 아닌 Xml serializer를 사용하는 것처럼 보입니다. 아마도 svcutil.exe 대신 wsdl.exe를 사용했기 때문일 수 있습니다.

svcutil.exe를 사용하여 서버 쪽 스텁을 만들려고 할 수 있습니까? 여전히 같은 문제가 보이나요?

마크

+0

DataContractSerializer와 함께 SvcUtil.exe를 사용하여 생성 된 인터페이스에는 void 매개 변수없는 메서드가 포함되어 있습니다. 메서드는 요청 형식을 받아들이고 응답 형식을 반환해야합니다.이 외에도 데이터 형식이 생성되지 않습니다. SvcUtil으로 뭔가를 놓친 건가요? 또한 중요 :이 경우/ser 옵션을 "auto"로 설정하면 XmlSerializer가 사용됩니다. – oltman

+0

업데이트 : SvcUtil.exe가 생성하고 올바른 wsdl을 게시하도록 코드를 생성했습니다. 몇 가지 질문 : 비록 1) wsdl.exe는 WCF가 아닌 경우에 사용하기위한 것입니까? 2) 내가 SvcUtil을 잘못 사용했다.DataContractSerializer를 사용할 때 exe? – oltman

+0

wsdl.exe는 "구식"ASMX 웹 서비스에 사용되었습니다. - .NET 1.x/2.x 기술 - 지난 세기 거의 ----) –

4

귀하의 datacontracts는 XmlSerializer가 엔진을 사용하지만 OperationContract를가 DataContractSerializer를 사용하고 있습니다.

은 경우에 따라 DataContractSerializer 당신의 유형을 직렬화 적합하지

MSDN http://msdn.microsoft.com/en-us/library/ms732038(v=VS.90).aspx에서 동작 계약

에서 XmlSerializerFormatAttribute을 적용합니다. WCF는 매개 변수를 serialize하는 데 사용할 수있는 대체 serialization 엔진 인 XmlSerializer를 지원합니다. XmlSerializer를 사용하면 XmlAttributeAttribute와 같은 특성을 사용하여 결과로 생성되는 XML을보다 세부적으로 제어 할 수 있습니다. 특정 작업이나 전체 서비스에 대해 XmlSerializer를 사용하도록 전환하려면 XmlSerializerFormatAttribute 특성을 작업이나 서비스에 적용합니다. 예 :

[ServiceContract] 
public interface IAirfareQuoteService 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    float GetAirfare(Itinerary itinerary, DateTime date); 
} 

자세한 내용은 XmlSerializer 클래스 사용을 참조하십시오. 수동으로 XmlSerializer로 전환하는 것은 여기에 설명 된대로 해당 항목에서 자세히 설명 된 특별한 이유가없는 한 권장되지 않습니다.

관련 문제