3

wcf コントラクト内でオブジェクトを使用Streamしているため、MessageContract代わりに使用する必要がありDataContractます。

 [MessageContract]
    public class Document 
    {
        [MessageBodyMember(Order = 1)]
        public System.IO.Stream FileData;

}

 [MessageContract]
    public class A : Document 
    {
        [MessageBodyMember]
        public string input;

}

 [MessageContract]
    public class B : Document 
    {
        [MessageBodyMember]
        public string someProp;

}

[ServiceContract]
    public interface ISomeService
    {

        [OperationContract]
        Document SomeMethod(Document file);
}

このサービスのコンシューマーに、A または B のいずれかのオブジェクトを作成し、それを使用してサービスを呼び出してもらいたいと考えています。サービス側では、それを適切なオブジェクトに型キャストしてから、何らかのアクションを実行できます。

問題は、サービスで使用されるか、で宣言されるまで、で指定できずKnownTypeMessageContract継承されたコントラクトをクライアントに公開できないことKnownTypeです。

グーグルで検索してみましたが、に関連するものは見つかりませんでしKnownTypeMessageContract

コメントで提案されているように...メッセージコントラクトを更新しましKnownTypeたが、サービス参照を通じてクライアントに公開されていません...

[MessageContract]
    [KnownType(typeof(FileSystemStoredDocument))]
    [KnownType(typeof(FileBoundStoredDocument))]
    [KnownType(typeof(SharepointStoredDocument))]

    public class Document : DocumentInfo, IDisposable
    {
}

ここで何が問題なのか、誰でも助けてくれますか?

:ALLKnownTypeはから継承されていますDocument

4

1 に答える 1

4

メッセージ コントラクトは、メッセージがどのように表示されるかを正確に記述します。これらは継承をサポートしていますが、特定の操作で使用している正確なメッセージ コントラクトを指定する必要があります。

メッセージの本文部分を確認すると、次のようになります。

ContractDescription.GetContract(typeof(ISomeService)).Operations[0].Messages[0].Body.Parts

オブジェクトの 1 つの部分だけが表示されStreamます。これは、本体に type の一部が含まれるデータ コントラクトとは対照的Objectです。なぜKnownTypeここでうまくいかないのかがわかります。

(このContractDescriptionクラスは、特に WSDL を生成するために使用されます。WsdlExporterクラスを参照してください。)

できることは、メッセージ コントラクトに含まれるデータ コントラクトの階層を作成することです。

[MessageContract]
public class Document 
{
    [MessageHeader]
    public DocumentProperties Properties;

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream FileData;
}

[DataContract]
[KnownType(typeof(A))]
[KnownType(typeof(B))]
public abstract class DocumentProperties { }

[DataContract]
public class A : DocumentProperties 
{
    [DataMember]
    public string input;
}

[DataContract]
public class B : DocumentProperties 
{
    [DataMember]
    public string someProp;
}

を渡したい場合は、複数の body メンバーを持つことはできないStreamため、残りのプロパティはヘッダーにある必要があることに注意してください。

于 2016-07-19T08:17:31.947 に答える