WCF에서는 일이 작동하지 않습니다
-
13-09-2019 - |
문제
간단한 수업을 가지고 있습니다. "팀"이라고 가정 해 봅시다. 그리고 팀 배열을 반환하는 getteams 작업과 함께 WCF 서비스 (IIS에서 호스팅 된 BasichttpBinding, IIS에서 호스팅)를 노출시킵니다.
팀 클래스는 모양입니다
[DataContract]
public class Team
{
[DataMember]
public int Id { get; set; }
[DataMember]
public Point Position { get; set; }
[DataMember]
public string Code { get; set; }
[DataMember]
public bool Available { get; set; }
[DataMember]
public string Extra { get; set; }
[DataMember]
public double X { get; set; }
[DataMember]
public double Y { get; set; }
}
클라이언트 (Silverlight 3.0 앱)에서 모든 데이터를 얻지 만 위치 속성에는 기본 포인트 인스턴스가 있습니다. 포인트 구조는입니다 System.windows.media.point 직렬화 가능합니다. 또한 X 및 Y 속성을 추가하여 위치 데이터를 복제하여 와이어의 다른 쪽 끝에 올바른지 확인합니다.
XML은 가로 채기 (감사합니다, Firebug!)는 다음과 같습니다.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetTeamsResponse xmlns="http://tempuri.org/">
<GetTeamsResult xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Team>
<a:Code>A23HJGF23</a:Code>
<a:Available>true</a:Available>
<a:Extra i:nil="true"/>
<a:Id>1</a:Id>
<a:Position xmlns:b="http://schemas.datacontract.org/2004/07/System.Windows">
<b:_x>572194.59937858</b:_x>
<b:_y>322518.3889979</b:_y>
</a:Position>
<a:X>572194.59937858</a:X>
<a:Y>322518.3889979</a:Y>
</a:Team>
<!-- other <a:Team> elements -->
</GetTeamsResult>
</GetTeamsResponse>
</s:Body>
</s:Envelope>
따라서 사막화 문제가있는 것 같습니다. 예외는 던지지 않습니다!
왜요?
해결책
간단한 설명과 마찬가지로 SL이 SL 포인트 클래스를 사용하려고하는 동안 WCF 서비스가 .NET 3 / 3.5 포인트 클래스를 반환하고 있습니까? 또는 둘 다 같은 점 구조를 언급하고 있습니까?
위치 데이터 콘텐츠의 네임 스페이스는 SL 포인트와 동일하지 않은 CLR / WPF 포인트를 사용하는 것으로 보이기 때문에 .NET 버전을 SL 버전으로 전달하고 있다고 생각합니다.
WCF 엔드 포인트는 iserializable을 사용하여 데이터 계약 시리얼 라이저 대신 XMLSerializer로 변경되므로 데이터를 볼 수 있지만 현재 XML에서 볼 수있는 사용자 정의 클래스로 표시됩니다.
편집하다:
구조물 위치에 대한 명확성을 위해
SL3 Point Struct는 System.Windows.dll에 있습니다 (http://msdn.microsoft.com/en-us/library/system.windows.woint.point(vs.95).aspx) .net 3.0 포인트 구조는 Windowsbase.dll에 있습니다 (http://msdn.microsoft.com/en-us/library/system.windows.wointe(vs.85).aspx) .net 3.5 Windowsbase.dll의 포인트 구조물 (http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)
.NET을 SL과 비교할 때 같은 클래스는 아닙니다.
SL 2.0에서 발생하고 SL 웹 사이트에서보고됩니다. (http://silverlight.net/forums/t/26577.aspx)
다른 팁
클라이언트가 데이터 유형을 인식하지 못하는 것 같습니다. 가리키다.
지적한대로 System.windows.media.point는 .NET 3.0 및 Silverlight에 있습니다.
데이터 계약에서 Point를 System.Windows.media.point로 선언 할 수 있습니다. 또한 필요한 DLL이 클라이언트 프로젝트에서 참조되어 있는지 확인하십시오.