我创建了一个WCF服务,对于默认服务,我在主DataContract上添加了另一个操作 Contract :
[OperationContract]
void DoSomething(UserData data);
然后我在下面有这样的东西(简化为例子的目的) . 问题是,即使层次结构中的所有类都使用DataContract进行修饰,并且所有成员都使用DataMember修饰,但当我使用WCF测试客户端时,它有一个红色图标,表示“WCF测试客户端不支持该操作” .
[DataContract]
public class UserData {
[DataMember]
public uint One { get; set; }
[DataMember]
public CompositeType Extra { get; set; }
public UserData() { ctor. code }
}
[DataContract]
public class CompositeType {
[DataMember]
public uint Two { get; set; }
public UserData() { ctor code }
}
4 回答
将属性添加到'UserData'类
[KnownType(typeof(CompositeType))]
喜欢:
http://msdn.microsoft.com/en-us/library/ms730167.aspx
编辑:
http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx
OperatingSystem类有一些与其他类相关的属性 . 您可以在已知类型中包含所有这些类,但依赖关系链可能会变得相当大,我强烈建议您根本不使用操作系统类 .
您应该从操作系统类中找出实际需要的信息,并创建自己的DTO以传回响应 . 这样您就可以确保所有类型都可以在 Contract 中轻松定义 .
好了,经历了整个事情(感谢大家的提示)解决方案是这样的:
根本不需要
DataContract
中的IsReference
属性即使
OperationContract
返回无效,也根本不需要DataContract
中的IsOneWay
属性 .如果层次结构中的所有子类型都是我的,也不需要
KnownType
,换句话说,由我而不是.NET定义,并在适当时用DataContract
或DataMember
标记摆脱
OperatingSystem
并构建一个从OperatingSystem
中提取所需信息的包装DataContract
解决了这个问题 .现在WCF测试客户端没有错误
如果您创建测试客户端(如控制台应用程序)并向wcf添加服务引用,该服务是否有效?如果是,那么您的datacontract可能具有WCF测试客户端不支持的那些类型之一 .
See this related issue
服务调用的WCF默认期望是请求 - 响应--WCF期望某种响应 .
如果你想使用
void
(如:没有返回值),你需要用这些方法来装饰告诉WCF运行时 not 期望来自调用的任何返回值
在MSDN杂志中阅读有关WCF: Working with One-Way Calls, Callbacks and Events的更多信息 .