我在我的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的对象,并使用它调用服务。在服务端,我可以将其类型转换为适当的对象,然后执行一些操作。
问题是,我不能用KnownType指定MessageContract,而继承的合同只有在服务中使用或与KnownType一起声明后才能公开给客户端。
我尝试过谷歌,但找不到与KnownType和MessageContract有关的任何东西。
正如评论中所建议的..。我用KnownType更新了我的消息契约,但是它们仍然没有通过服务引用向客户公开.
[MessageContract]
[KnownType(typeof(FileSystemStoredDocument))]
[KnownType(typeof(FileBoundStoredDocument))]
[KnownType(typeof(SharepointStoredDocument))]
public class Document : DocumentInfo, IDisposable
{
}有人能帮我吗?这里怎么了?
注意事项:所有KnownType都是从Document继承的
发布于 2016-07-19 08:17:31
消息契约准确地描述了消息应该是什么样的。它们确实支持继承,但您必须指定在特定操作中使用的确切消息契约。
如果您检查消息的主体部分:
ContractDescription.GetContract(typeof(ISomeService)).Operations[0].Messages[0].Body.Parts您将确切地看到一个部分-- Stream对象。这与数据契约形成了对比,在数据契约中,主体包含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,则不能有多个主体成员,因此其他属性必须位于标头中。
https://stackoverflow.com/questions/38413321
复制相似问题