3

Stream在我的 wcf 合同中使用对象,因此被迫使用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 的对象并使用它调用服务。在服务方面,我可以将其类型转换为适当的对象,然后执行一些操作。

问题是我不能指定KnownTypewithMessageContract并且继承的合同不能暴露给客户,直到它们在服务中使用或声明为KnownType.

我尝试用谷歌搜索,但找不到与KnownTypewith相关的任何内容MessageContract

正如评论中所建议的......我更新了我的消息合同,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

你会看到一个部分——一个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;
}

请注意,如果要传递 a ,则不能有多个正文成员Stream,因此其余属性必须在标头中。

于 2016-07-19T08:17:31.947 回答