WCFでは機能していません
-
13-09-2019 - |
質問
私はシンプルなクラスを持っています。「Team」と言ってみましょう。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アプリ)では、すべてのデータが取得されますが、Positionプロパティにはデフォルトポイントインスタンスがあります。ポイント構造はです 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>
したがって、敏arialialiationializationの問題があるようです。 例外はありません!
なんで?
解決
迅速な明確化として、SLがSLポイントクラスを使用しようとしている間、WCFサービスは.NET 3 / 3.5ポイントクラスを返していますか?または、どちらも同じ点構造を指していますか。
slバージョンに.netバージョンを渡すと思っています。なぜなら、データコントラクトの位置の名前空間は、SLポイントと同じではないCLR / WPFポイントを使用していることを示しているようです。
WCFエンドポイントは、ISERIALIALIZABLEを使用して、データ契約シリアイザーの代わりにXMLSerializerに変更できるため、データが表示されますが、現在XMLで表示される_Xおよび_Yのカスタムクラスとして表示されます。
編集:
structの場所で明確にします
SL3ポイント構造体はsystem.windows.dllにあります(http://msdn.microsoft.com/en-us/library/system.windows.point(vs.95).aspx).NET 3.0ポイント構造体はWindowsBase.dll(http://msdn.microsoft.com/en-us/library/system.windows.point(vs.85).aspx).NET 3.5 Point struct in Windowsbase.dll(http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)
同名、.NETをSLと比較する場合、同じクラスではありません。
そして、少し追加され、SL 2.0で発生し、SL Webサイトで報告されています。 (http://silverlight.net/forums/t/26577.aspx)
他のヒント
クライアントがデータ型を認識していないようです 点.
system.windows.media.pointは.net 3.0とsilverlightにあります。
データ契約でsystem.windows.media.pointとして宣言することを試みることができます。また、必要なDLLがクライアントプロジェクトで参照されていることを確認してください。