質問

どう伝え、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.exesvcutil.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

注意:この場合制御の両方のサーバとクライアント

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top