WCFお客様との問題認識ServiceKnownTypes?
-
27-09-2019 - |
質問
どう伝え、WCFサービスかKnownTypes時に使用するデーターの事です。
んを利用できま [ServiceKnownType]
属性、サービスの呼び出し実行、スタッフのピーしても失敗したからです。私何かが足りない。
[OperationContract]
[ServiceKnownType(typeof(SubClassA))]
[ServiceKnownType(typeof(SubClassB))]
BaseClassZ GetObject();
エラーメッセージからのお客様:
{"要素 'http://schemas.datacontract.org/2004/07/BaseClassZ' データが存在するタイプからマップ の名称 'http://schemas.datacontract.org/2004/07/SubClassA'.はデシリアライザに関する知識が全くない 任意の型マップがこの名前です。使用を考慮してDataContractResolver 追加のタイプに対応する 'SubClassAのリストの種類 例えば、KnownTypeAttribute属性または 追加でリストの種類 渡DataContractSerializer."}
直列化さ/Deserializingのオブジェクトは、WCFサーバーを使用DataContractSerializerトKnownTypesに働きます。
更新: これまでのトの読み込みオブジェクトが正しくすれば追加KnownType属性の基底クラスですが、いまだかつてこの辺りできればベースのクラスを使用するための多くの項目や思いを変更KnownType属性の基底クラスでかつ新しい商品です。
[DataContract]
[KnownType(typeof(SubClassA))]
[KnownType(typeof(SubClassB))]
public class BaseClassZ
{
...
}
解決
な抑止サービスコードを知られた入ります。のコンフィグをサービス:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="SomeNs.BaseClassZ, SomeAssembly">
<knownType type="SomeNs.SubClassA, SomeAssembly" />
<knownType type="SomeNs.SubClassB, SomeAssembly" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
だいたいのでコードを使用する必要がありこの属性にサービス-インタフェースにならないため、操作方法がしっくりくるかもしれません宣言的アプローチ:
[ServiceContract]
[ServiceKnownType(typeof(SubClassA))]
[ServiceKnownType(typeof(SubClassB))]
public interface IFoo
{
[OperationContract]
BaseClassZ GetObject();
}
更新:
いけ サンプルプロジェクト 図を使います。configの設定に知られる種である私の好ましい。別 サンプルプロジェクト を第二のアプローチ.
更新2:
を見てからコードの更新のSilverlight用イにおける以下の定義:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IService1")]
public interface IService1 {
[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetMany", ReplyAction="http://tempuri.org/IService1/GetManyResponse")]
System.IAsyncResult BeginGetMany(System.AsyncCallback callback, object asyncState);
System.Collections.ObjectModel.ObservableCollection<MyCommonLib.BaseClassZ> EndGetMany(System.IAsyncResult result);
[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetSingle", ReplyAction="http://tempuri.org/IService1/GetSingleResponse")]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyCommonLib.SubClassA))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyCommonLib.SubClassB))]
System.IAsyncResult BeginGetSingle(System.AsyncCallback callback, object asyncState);
MyCommonLib.BaseClassZ EndGetSingle(System.IAsyncResult result);
}
通知がどのよう BeginGetSingle
方法を含む既知の属性を持つ BeginGetMany
方法は来ない。この属性におけるサービス定義のクラスのこのようになります。
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IService1")]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyCommonLib.SubClassA))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyCommonLib.SubClassB))]
public interface IService1
{
[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetMany", ReplyAction="http://tempuri.org/IService1/GetManyResponse")]
System.IAsyncResult BeginGetMany(System.AsyncCallback callback, object asyncState);
System.Collections.ObjectModel.ObservableCollection<MyCommonLib.BaseClassZ> EndGetMany(System.IAsyncResult result);
[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetSingle", ReplyAction="http://tempuri.org/IService1/GetSingleResponse")]
System.IAsyncResult BeginGetSingle(System.AsyncCallback callback, object asyncState);
MyCommonLib.BaseClassZ EndGetSingle(System.IAsyncResult result);
}
このautogeneratedクラスにはバグの SLsvcUtil.exe や svcutil.exe
としての品が展示されていますが同じ行動です。にされている属性の正しい場所を解決の問題です。問題はこのクラスはautogeneratedによるツールとしようとした場合に再生してからWSDLすべての空港を表示一部の空港を表す。
そうでない場合は、以下のサービス定義:
[ServiceContract]
[ServiceKnownType(typeof(SubClassA))]
[ServiceKnownType(typeof(SubClassB))]
public interface IService1
{
[OperationContract]
BaseClassZ[] GetMany();
[OperationContract]
BaseClassZ GetSingle();
}
3データを契約される共有しながらクライアントとサーバーをインポートする場合は定義サービスの方法は、コレクションを返しまい、正しい知られるタイプ属性は、生成された顧客行います。ることによりデザイン。
他のヒント
かなり時間今日は何であって、えしましたが、同じ問題です。の解だったことを今でも覚えているのAddGenericResolver方法からIDesignのServiceModelEx図書館があります。
注意:.NET4.0必要として使用す DataContractResolver
できるでそれを見つけることができ IDesignダウンロードページ.
いった追加次のコード:
Client.AddGenericResolver( typeof ( K2Source ) );
ということで他人が保存数時間!
また、この情報は、書籍"プログラミング、WCFサービス:マスタリングWCFと紺碧のAppFabricサービスバス"によるJuval Lowy
もう一つの方法があります。によって使用追加サービス基準"のコードにプロキシクラス.で符号化が当初はおはより安定した、強固なソリューション.を行うことにより時間が短縮でき、大変おります。
参照: http://www.dnrtv.com/default.aspx?showNum=122
注意:この場合制御の両方のサーバとクライアント