我创建了一个WCF服务,对于默认服务,我在主DataContract上添加了另一个操作契约:
[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 }
}
答案 0 :(得分:5)
好的,完成了整个过程(感谢所有提示)解决方案就是:
IsReference
中的DataContract
属性IsOneWay
返回无效,也根本不需要DataContract
中的OperationContract
属性。KnownType
,换句话说,由我而不是.NET定义,并在适当时标记为DataContract
或DataMember
OperatingSystem
并构建一个从DataContract
中提取必要信息的包装OperatingSystem
解决了这个问题。现在WCF测试客户端
没有错误答案 1 :(得分:4)
将该属性添加到“UserData”类[KnownType(typeof(CompositeType))]
像:
[DataContract]
[KnownType(typeof(CompositeType))]
public class UserData
{
[DataMember]
public uint One { get; set; }
[DataMember]
public CompositeType Extra { get; set; }
public UserData() { ctor. code }
}
http://msdn.microsoft.com/en-us/library/ms730167.aspx
编辑:
http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx
OperatingSystem类有一些与其他类相关的属性。您可以在已知类型中包含所有这些类,但依赖关系链可能会变得相当大,我强烈建议您根本不使用操作系统类。
您应该从操作系统类中找出实际需要的信息,并创建自己的DTO以传回响应。这样,您就可以确保在合同中轻松定义所有类型。
答案 2 :(得分:0)
如果您创建测试客户端(如控制台应用程序)并向wcf添加服务引用,该服务是否有效?如果是,那么您的datacontract可能具有WCF测试客户端不支持的那些类型之一。
答案 3 :(得分:0)
服务调用的WCF默认期望是请求 - 响应--WCF期望某种响应。
如果你想使用void
(如:没有返回值),你需要用
[OperationContract(IsOneWay = true)]
void DoSomething(UserData data);
告诉WCF运行时不期望来自调用的任何返回值
在MSDN杂志中阅读有关WCF: Working with One-Way Calls, Callbacks and Events的更多信息。