【发布时间】:2013-06-17 10:01:02
【问题描述】:
当我调用我的 WCF Soap 服务的方法时,抛出一个错误,并且在 svlog 文件中出现错误:
不应使用数据协定名称“Message:http://schemas.datacontract.org/2004/07/xxx.ActiveDirectoryService.classes.WCF”键入“xxx.ActiveDirectoryService.classes.WCF.Message”。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。
我尝试在这里和那里使用 KnownType,但没有成功(我必须承认我不太确定我是否 100% 正确使用它)。
这是我的接口/类:
[ServiceContract]
public interface IActiveDirectory
{
[OperationContract]
[WebGet]
void Dummy();
[OperationContract]
[WebGet]
AbstractMessage Dummy2();
[OperationContract]
[WebGet]
AbstractMessage Dummy3();
[OperationContract]
[WebGet]
AbstractMessage SetPassWord(string customer, string customerPassword, string userLogin, string userPassword);
}
[DataContract]
public abstract class AbstractMessage
{
[DataMember]
public virtual bool IsError { get; set; }
[DataMember]
public virtual string ErrorMessage { get; set; }
[DataMember]
public virtual string ReturnValue { get; set; }
}
public class Message : AbstractMessage
{
<...>
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
[KnownType(typeof(AbstractMessage))]
public class ActiveDirectory : IActiveDirectory
{
public void Dummy()
{
}
public AbstractMessage Dummy2()
{
return new AbstractMessage();
}
public AbstractMessage Dummy3()
{
return new Message();
}
public AbstractMessage SetPassWord(string customer, string customerPassword, string userLogin, string userPassword)
{
<...>
return message; // message is of type Message
}
}
编辑:12AM35 GMT+1
我添加了 Dummy() 方法。
- 从客户端调用 Dummy 工作正常。
- 从客户端调用 Dummy2 工作正常。
- 从客户端调用 Dummy3 会导致同样的错误。
编辑 12AM39 GMT+1
进行以下更改没有帮助。
[DataContract]
[KnownType(typeof(AbstractMessage))]
public class Message : AbstractMessage
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
[KnownType(typeof(AbstractMessage))]
[KnownType(typeof(Message))]
public class ActiveDirectory : IActiveDirectory
编辑:13AM31 GMT+1
如果我将 Dummy3 返回类型设置为 Message,则在客户端代码中调用 Dummy3 会起作用。
WCF + 多态性有些奇怪...
【问题讨论】:
标签: c# wcf serialization types