1

System.Object型(WSDLではxs:anyType)のパラメーターを持つメソッドを定義するサービスコントラクトがあります。このパラメーターで単純型と複合型を渡せるようにしたいと思います。単純型は正常に機能しますが、WSDLで定義されている複合型を渡そうとすると、次のエラーが発生します。

要素' http://tempuri.org/:value 'には、'http://schemas.datacontract.org/2004/07/MyNamespace:MyClass'データコントラクトのデータが含まれています。デシリアライザーは、このコントラクトにマップされるタイプについての知識を持っていません。'MyClass'に対応するタイプを既知のタイプのリストに追加します。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

既知の型として追加しても、WSDLに既に含まれているため、役に立ちません。「xs:anyType」パラメータを介して複合型のオブジェクトを渡すにはどうすればよいですか?

より詳しい情報:

これはNetDataContractを使用する場合に機能すると思いますが、クライアントがSilverlightであるため、使用できません。

xs:anyTypeを明示的に拡張する複合型への参照を見たことがありますが、それを行うWSDLをWCFで生成する方法がわかりません。また、それが役立つかどうかもわかりません。

ありがとう

4

6 に答える 6

2

NetDataContractSerializerにはタイプ情報が含まれているため、NetDataContractは機能します。

KnowType属性は、メッセージを逆シリアル化する方法をDataContractSerializerに指示します。実装固有であるため、これはパブリックコントラクトによって定義された情報であり、WSDLには属していません。

デシリアライザーは適切なタイプを識別してインスタンスを作成する必要があるため、古いデータタイプを渡すことはできません。

DataContractにハードコーディングするのではなく、実行時に既知の型を導出できる場合があります。サンプルはこちらをご覧ください。

于 2008-09-16T07:30:34.150 に答える
1

これが役立つことを願っています。同僚がこのコードを使用して複雑なデータ型を送信しているのを見ましたが、これは非常に単純です。これは basicHttpBinding で使用され、MOSS BDC やその他の基本バインディングを使用するアプリケーションでうまく機能します。

  1. ジェネリック クラスに基づいてデータ コントラクトを作成する
  2. 情報を送信する必要がある場合は、データ コントラクトを使用します

    [DataContract(Namespace = " http://Service.DataContracts ", Name = "ServiceDataContractBase")] public class ServiceDataContract {

    public ServiceDataContract() { }
    
    public ServiceDataContract(TValueType Value)
    {
        this.m_objValue = Value;
    }
    
    private TValueType m_objValue;
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)]
    public TValueType Value
    {
        get { return m_objValue; }
        set { m_objValue = value; }
    }
    

    }

複雑なデータ型を返す WCF 関数で必要な場合は常に、このデータ コントラクトを使用します。例えば:

public ServiceDataContract<string[]> GetStrings()
{
    string[] temp = new string[10];
    return new ServiceDataContract<string[]>(temp);
}

更新: ServiceDataContract は TValueType を使用するジェネリック クラスです。HTML のレンダリングに問題があるため、表示されません。

于 2008-09-17T08:59:39.577 に答える
1

ServiceKnownType 属性を使用して、この問題を解決しました。サービス コントラクトで複雑な型をサービスの既知の型として追加するだけで、エラーはなくなります。前回試したとき、なぜこれがうまくいかなかったのかわかりません。

WSDL にはまったく影響を与えないようです。そのため、シリアライズされたストリームには、私の型を使用してオブジェクトをデシリアライズできることをデシリアライザーに通知する何らかの違いがあるはずです。

于 2008-12-15T23:58:03.793 に答える
0

データコントラクトサロゲートを使用して、ドットネット固有または相互運用可能なタイプではないサポートされていないオブジェクトをマップしてみてください。MSDNを参照してください

于 2008-09-16T07:47:02.893 に答える
0

今のところ、別のデータ コントラクト型または単純な型のいずれかをラップできる新しいデータ コントラクト型を作成することで、この問題を回避しました。Object 型を渡す代わりに、このラッパー クラスを渡します。これで問題なく動作しますが、元の問題に対する解決策があるかどうかを知りたいです。

于 2008-09-17T17:11:28.083 に答える
0

渡そうとしているタイプを指定して ServiceKnownType 属性を追加しようとしましたが、それでも同じエラーが発生します。また、KnownType 属性をデータ コントラクトに追加しようとしました (データ コントラクトと同じ型だったのでばかげているように見えました)。コンパイル時にそれらを追加しても役に立たない場合、実行時にそれらを追加しても役に立たないと思います。

別の複合型を拡張する場合、KnownType 属性をその基本型に追加したいと思うでしょう。しかし、私の基本型はオブジェクトであるため、これを行う方法がわかりません。

サロゲートに関しては、これらは契約が定義されていない型をラップするために使用されているようです。ただし、私の場合は、契約を定義しています。

于 2008-09-16T15:33:34.350 に答える