Silverlight 클라이언트를 사용하여 Dictionary<string, object>
을 반환하는 ASP.Net WCF 서비스를 호출하려고했습니다. 사전에있는 값이 int
, string
또는 Guid
과 같은 단순한 유형 인 경우 제대로 작동합니다.사전 배열 <string, object>를 반환하는 WCF 서비스
그러나 이제는 값 중 하나가 Dictionary<string, object>
의 배열이되어야하는 시나리오가 있습니다! 모두 잘 컴파일되고 서비스의 서명은 변경되지 않았지만 이제는 서비스 호출이 실패합니다.
아이디어를 고치는 방법은 무엇입니까? KnownType
및 ServiceKnownType
속성을 사용하여 서비스 클래스 및 메서드에 주석을 추가하려고했지만 작동하지 않았습니다.
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[OperationContract]
[ServiceKnownType(typeof(Dictionary<string, object>))]
public Dictionary<string, object> GetObject()
{
return new Dictionary<string, object>()
{
{ "pty1", 1 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
{ "pty4", new Dictionary<string, object>[]
{
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
}
,
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blahblah" },
}
}
}
};
}
}
귀하의 답변을 주셔서 감사합니다 : 여기
코드의 조각이다. WCF 추적을 켰으며 의심되는 것처럼 직렬화 중에 문제가 있습니다. 문제는
Dictionary<string, object>
의 직렬화가 아니며
Array
중 하나는
Dictionary<string, object>
입니다.
여기 WCF 서비스에서 기록한 예외입니다.
매개 변수를 직렬화하려고하는 동안 오류가 발생했습니다 : GetObjectResult. InnerException 메시지는 '형식'System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, 버전 2.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089], [System.Object, mscorlib, 버전 = 2.0. 0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] [] '데이터 계약 이름이'ArrayOfArrayOfKeyValueOfstringanyType : http://schemas.microsoft.com/2003/10/Serialization/Arrays '인 것은 아닙니다. 알려진 유형 목록에 정적으로 알려지지 않은 유형을 추가하십시오 (예 : KnownTypeAttribute 속성을 사용하거나 DataContractSerializer에 전달 된 알려진 유형 목록에 추가). ' 자세한 내용은 InnerException을 참조하십시오.
단일 데이터 멤버를 사용하여 새로운 DataContract
클래스를 정의하려고 시도했지만 매우 오류가 발생합니다.
다음 코드는 WCF 로깅에서 로그 된 예외입니다. 매개 변수를 직렬화하는 동안
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
오류가 발생했습니다 : GetObjectResult. InnerException 메시지가 'Type'System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, 버전 2.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089], [SilverlightApplication7.Web.ObjectHolder, SilverlightApplication7.Web, 버전 = 1.0.0.0, 문화 = 중립, PublicKeyToken = null]] [] '데이터 계약 이름이'ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb : http://schemas.microsoft.com/2003/10/Serialization/Arrays '이 아닙니다. 알려진 유형 목록에 정적으로 알려지지 않은 유형을 추가하십시오 (예 : KnownTypeAttribute 속성을 사용하거나 DataContractSerializer에 전달 된 알려진 유형 목록에 추가). ' 자세한 내용은 InnerException을 참조하십시오. 예외가 "
ArrayOfArrayOfKeyValueOfstringObjectHolder
"을 언급 이후
는 다시 나는 ObjectHolder
, ObjectHolder[]
심지어 ObjectHolder[][]
에 대한 ServiceKnownType
와 함께 연주했습니다.
아직 해결 방법이 없습니다.
어떤 오류가 발생합니까? –
내 생각 엔 WCF가 개체를 직렬화하는 데 문제가있을 수 있습니다. 가능하다면 사전을 만들 수도 있습니다.. –
sipwiz
나는 sipwiz에 동의한다. 당신은 dictionary를 직렬화하는 데 어려움을 겪을 것이다. 사전에 직렬화 할 수있는 객체가 있어야합니다 (Dictionary로 Dictionary 를 변경해야 함을 의미 함) –
srodriguez