WCFのservicknowntytepeの理解
-
02-10-2019 - |
質問
私はWCFでservicknowntytypeを理解するのに少し苦労しています。
から取られた このブログ, 、次のコードが機能しません。
[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}
[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}
[ServiceContract]
public interface IMyServer
{
[OperationContract]
bool AddShape(Shape shape);
}
.
IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();
client.AddShape(new Circle());
それが機能しない理由は、あなたが円を追加しようとしているからですが、ServiceContractは形状のみを許可します。あなたは既知のタイプで何かをすることになっていますが、私はそれがどのように機能するかについて少し混乱しています。
そのコードはサービスにあるので、なぜ円が形状から派生していることを自動的に知らないのですか?さらに、servicknowntypeは実際に何をしますか?
ServicknownTypeがDataContractの下に置かれている場合、明らかに機能します。私はそれがちょっと、形状と呼ばれるこの特定のオブジェクトタイプも円になると言っていると思います。私はそれがこのようにそれを行う理由を理解するのに苦労しています。なぜなら、あなたが正方形のような新しいタイプを追加すると、あなたはそれのためにShapeクラスAサービスの知識タイプに追加する必要があるからです。それがそれを推測できないなら、既知のタイプを形状ではなく正方形に置くことは意味がありませんか?それで、広場はちょっと、私は形であり、あなたはシェイプクラスをいじる必要はありませんか?シェイプクラスがライブラリに組み込まれており、Diamondshapeのような独自の隣接した形状を作成する場合、ソースコードにアクセスできないため、シェイプクラスに追加することはできません。
解決
問題は、WCFがすべてのアセンブリに入らず、形状のすべてのサブタイプを見つけようとすることです。また、XMLドキュメントでタイプ情報(アセンブリ、完全資格のタイプ名)を送信しません。
したがって、発信するXMLにタグ「円」を生成することは問題ではありませんが、着信するdeserializaterはこれをどうするかわかりません。
既知のタイプの「ハック」は、双方が実装する必要がある既知のタイプのレジストリのようなものです。それは明示的です。このレジストリを使用すると、Deserializerは、「サークル」がXに敏感になり、アンビティの機会がなく、派生タイプのすべての利用可能または到達可能なアセンブリを解析することなく、XのタイプXに敏感であることを知っています。
Squareは「私は形」とは言わず、XMLタグとして来ていることを忘れないでください。