wcf - WCF 中 MessageContract 的已知类型

标签 wcf c#-4.0 datacontract messagecontract known-types

我在我的 wcf 契约(Contract)中使用 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 的对象并使用它调用服务。在服务端,我可以将其类型转换为适当的对象,然后执行一些操作。

问题是我不能用 MessageContract 指定 KnownType 并且继承的契约(Contract)在服务中使用或用 KnownType 声明之前不能暴露给客户端.

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

正如评论中所建议的...我用 KnownType 更新了我的消息契约(Contract),但它们仍然没有通过服务引用暴露给客户端...

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

    public class Document : DocumentInfo, IDisposable
    {
}

谁能帮我看看这里出了什么问题?

注意:所有KnownType都继承自Document

最佳答案

消息契约描述了消息应该是什么样子。它们确实支持继承,但您必须指定在特定操作中使用的确切消息协定。

如果您检查消息的正文部分:

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,则不能有多个主体成员,因此其余属性必须在标题中。

关于wcf - WCF 中 MessageContract 的已知类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38413321/

相关文章:

excel - 尝试使用 Microsoft.Office.Interop.Excel.Workbooks.Open() 打开 Excel 时出现异常 HResult 0x800a03ec

c# - 执行后端电子邮件进程而不让用户等待它完成

c#-4.0 - GDI+ 一般错误

mysql - C# 到 MY SQL 延迟查询执行

.net - 紧凑型框架 3.5 是否支持 System.Runtime.Serialization?

c# - DataContractAttribute 基础知识

c# - 具有多态 DataContracts 的 REST - 反序列化失败

c# - WCF 全双工处理客户端断开连接

wcf - 在 WCF 服务中发布 DataAnnotation 属性,并在使用者代理类中重新生成它们?

c# - 如何在不重启的情况下生成服务模型元数据