2016-07-16 13 views
3

Streamオブジェクトを私のwcfコントラクト内に使用していますので、DataContractの代わりにMessageContractを使用するように強制しました。WCFのMessageContractのKnownType

[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と宣言されるまで、クライアントに公開することはできません。

私はgoogleを試みましたが、KnownTypeに関連するものはMessageContractで見つかりませんでした。

コメントで示唆したように...私はKnownTypeと私のメッセージコントラクトを更新したが、彼らはまだサービス参照を介してクライアントに公開されていません...

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

    public class Document : DocumentInfo, IDisposable 
    { 
} 

は、いずれもここで間違っているものを私を助けることができますか?

:ALL KnownTypeDocument

+0

私が言っていることは間違っているようです。 AFAIKでは 'MessageContract'で' KnownType'を使うことができます。しかし、私はストリームがシリアライズ可能ではないことを覚えていると信じています。あなたがそれらを転送できないことを意味します。また、[this](http://stackoverflow.com/questions/3208866/wcf-message-contract-and-streaming)を見てください – lokusking

+0

あなたは例外を投稿できますか?また、既知の型として 'DocumentInfo'をマークしましたか? – lokusking

+0

例外はありません。プロキシ生成コードで派生型を簡単に見ることはできません。およびドキュメント情報は、すでにサービス契約のメソッドの1つに含まれているため、knownTypeとしては記述されていません。 – Abhash786

答えて

4

メッセージ契約から継承されますが、メッセージがのようになりますどのように正確にを記述する。彼らは継承をサポートしていますが、特定の操作で使用している正確なメッセージ契約を指定する必要があります。あなたがメッセージの身体の部分を確認した場合

は: - Streamオブジェクト

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

あなたは正確に一つの一部が表示されます。これは、本体にタイプ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; 
} 

あなたがStreamを渡したい場合は、あなたが複数の本体部材を持つことはできませんので、残りのプロパティは、ヘッダーにする必要があります。

+0

ありがとう...これは私が必要とするものです。 – Abhash786

関連する問題