2010-03-24 7 views
4

실제 테스트에서 이상한 것을 흉내 내기위한 작은 테스트 웹 서비스가 있습니다. 데모는 앱과 동일한 동작을 보여 주므로 간결하게 데모를 사용합니다.형식이 WCF 서비스에 노출되지 않음

내 서비스 인터페이스 파일은 다음과 같이 보입니다 (VS2008에서 만든 기본 WCF 서비스 인 것처럼 보이지만 하단에 새로운 공용 메서드 (GetOtherType())와 두 개의 새로운 클래스 (SomeOtherType 및

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace WCFServiceTest 
{ 

    public class Service1 : IService1 
    { 


     #region IService1 Members 

     public string GetData(int value) 
     { 
      throw new NotImplementedException(); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 

     #region IService1 Members 


     public SomeOtherType GetOtherType() 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 
} 

내가 가진 문제는 다음과 같이 SomeComplexType). SomeOtherType 유형의 SomeComplexType의 일반적인 목록을 관리

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace WCFServiceTest 
{ 

    [ServiceContract] 
    public interface IService1 
    { 
     [OperationContract] 
     string GetData(int value); 

     [OperationContract] 
     CompositeType GetDataUsingDataContract(CompositeType composite); 

     [OperationContract] 
     SomeOtherType GetOtherType(); 

    } 


    [DataContract] 
    public class CompositeType 
    { 
     bool boolValue = true; 
     string stringValue = "Hello "; 

     [DataMember] 
     public bool BoolValue 
     { 
      get { return boolValue; } 
      set { boolValue = value; } 
     } 

     [DataMember] 
     public string StringValue 
     { 
      get { return stringValue; } 
      set { stringValue = value; } 
     } 
    } 

    [DataContract] 
    public class SomeOtherType 
    { 
     public List<SomeComplexType> Items { get; set; }  
    } 

    [DataContract] 
    public class SomeComplexType 
    { 

    } 
} 

내 서비스가 구현되었는지 나는 ASP에서이 서비스에 대한 서비스 참조를 포함하는 경우. NET 웹 응용 프로그램, 내가 ca Intellisense를 통해 SomeComplexType을 볼 수 없습니다. 오류가 유형 또는 네임 스페이스와 관련이 없습니다. 그러나 SomeOtherType을 찾을 수 있습니다 (형식이 공용 메서드 중 하나의 반환 형식이라고 가정합니다).

WCF 서비스에서 형식을 공개 메서드 중 하나 (반환 형식 또는 인수)의 메서드 시그니처에 포함하지 않은 경우 해당 형식을 공개 할 수 없다고 생각합니까? 그렇다면 어떻게 클라이언트의 SomeOtherType 인스턴스 안의 Items를 반복 할 수 있습니까?

많은 분들께 감사드립니다.

사이먼

+0

실제로 이상합니다. 데이터 계약과 서비스 자체를 한 곳에서 정의하는 이유는 무엇입니까? 또한 SVC 파일 또는 별도의 .cs 파일에 있습니까? – Slavo

답변

4

내가 가진 문제는 나는 ASP.NET 웹 응용 프로그램에서이 서비스에 대한 서비스 참조를 포함 경우 , intellisense를 통해 SomeComplexType을 볼 수 없습니다. 오류가 유형과 관련이 있거나 네임 스페이스를 찾을 수 없습니다. 그러나 SomeOtherType은 (public 메서드 중 하나에서 유형이 반환 유형이라고 가정합니다.)을 찾을 수 있습니다. 해당 유형 내 공공 방법 (반환 형식 또는 인수 중 하나) 중 하나의 방법 서명에 등장하지 않은 경우

내가 바로 생각에 나는 WCF 서비스에서 유형을 노출 할 수 있습니까? 그렇다면 클라이언트의 SomeOtherType 인스턴스 안의 항목에 대해 을 반복 처리하려면 어떻게해야합니까?

당신은 절대적으로 맞다 - 당신의 SomeComplexType는 서비스 방법 중 하나에서 사용되지 않습니다, 그것은 또한 실제로 서비스 방법에서 매개 변수로 사용되는 유형의에 [DataMember를]로 태그 적이 없어요.따라서 WCF의 관점에서 볼 때이 서비스는 필요하지 않으며 WSDL/XSD에 표시되지 않습니다.

로 그레이엄은 이미 지적 - 당신이 SomeComplexType 하나의 장소 사용 :

[DataContract] 
public class SomeOtherType 
{ 
    public List<SomeComplexType> Items { get; set; }  
} 

을하지만 Items 요소가 [DataMember]로 태그되지 않기 때문에, 그것은 (그리고 따라서 사용하는 유형)되지 않습니다 서비스의 WSDL/XSD에 포함되어 있습니다. ItemsDataMember으로 표시되지 않으므로 일련 번호가 지정된 WCF 메시지에도 포함되지 않으므로이 컬렉션을 반복 할 필요가 없습니다 .-)

그래서 실제로 가장 필요한 것일 수 있습니다. 단지 [DataMember] 속성을 Items 속성에 추가하면됩니다. 그러면 WSDL/XSD에 포함될 것이므로 SomeComplexType도 마찬가지입니다.

+0

Graham 및 marc_s에게 감사드립니다. 둘 다 질문에 대답했지만 완전한 대답이 다른 사람에게 도움이 될 수 있으므로 답변으로 marc_s를 표시했습니다. 모두에게 다시 한 번 감사드립니다. –

1

나는 그래서 그냥 파란색의 촬영으로,이 주제에 대한 모든 전문가에 아니에요 : 빈 DataContracts은 WCF에 의해 삭제됩니다? ComplexDataType에서 어떤 것을 노출 시키십시오 (일부 int이면 충분합니다).

또한 내장형 wcftestclient을 사용하여 유형의 사용 가능 여부를 확인할 수 있습니다 (이 경우 메타 데이터 교환을 켜야합니다).

2

, 당신은 당신의 SomeOtherType.Items 재산에 [DataMember] 속성을 필요 것 같은데 즉

[DataMember] 
public List<SomeComplexType> Items { get; set; } 
1

작동 계약 서명에서 직접 또는 간접적으로 사용되지 않는 경우 클래스 및 구성원을 노출시키기 위해 서비스의 알려진 유형을 사용할 수 있습니다.

0

사용하지 않는 경우에도 클라이언트 측에서 사용할 수 있도록하려는 유형의 경우, 아래 속성 클래스는 클라이언트 측에서 사용할 수 있도록하는 것이 편리합니다.

[KnownType(typeof(SomeComplexType))] 
관련 문제