WCF测试客户端中不支持操作
本文关键字:不支持 操作 客户端 测试 WCF | 更新日期: 2023-09-27 18:28:55
我创建了一个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 }
}
好吧,在经历了整个过程之后(感谢所有的提示),解决方案是:
- 根本不需要
DataContract
中的IsReference
属性 - 即使
OperationContract
返回void,也根本不需要DataContract
中的IsOneWay
属性 - 也不需要
KnownType
,前提是层次结构中的所有子类型都是我的,换句话说,由我而不是.NET定义,并酌情用DataContract
或DataMember
标记 - 去掉
OperatingSystem
并构建从OperatingSystem
中提取必要信息的包装器DataContract
解决了这个问题
现在WCF测试客户端中没有错误
将属性添加到"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以在响应中传递回来。这样你就可以确保所有类型都可以在你的合同中轻松定义。
如果您创建了一个测试客户端(如控制台应用程序)并向wcf添加了一个服务引用,该服务是否有效?如果是这样,那么您的数据合约可能具有WCF测试客户端不支持的类型之一。
请参阅此相关问题
WCF对服务调用的默认期望是请求-响应-WCF期望某种响应。
如果你想使用void
(如:无返回值),你需要用装饰这些方法
[OperationContract(IsOneWay = true)]
void DoSomething(UserData data);
告诉WCF运行时不要期望调用返回任何值
在MSDN杂志上阅读更多关于WCF的信息:使用单向调用、回调和事件。