WCF测试客户端不支持该操作

时间:2012-03-23 21:34:21

标签: c# wcf

我创建了一个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 }
}

4 个答案:

答案 0 :(得分:5)

好的,完成了整个过程(感谢所有提示)解决方案就是:

    完全不需要IsReference中的
  • DataContract属性
  • 即使IsOneWay返回无效,也根本不需要DataContract中的
  • OperationContract属性。
  • 如果层次结构中的所有子类型都是我的,则也不需要
  • KnownType,换句话说,由我而不是.NET定义,并在适当时标记为DataContractDataMember
  • 摆脱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测试客户端不支持的那些类型之一。

See this related issue

答案 3 :(得分:0)

服务调用的WCF默认期望是请求 - 响应--WCF期望某种响应。

如果你想使用void(如:没有返回值),你需要用

装饰这些方法
[OperationContract(IsOneWay = true)]
void DoSomething(UserData data);

告诉WCF运行时期望来自调用的任何返回值

在MSDN杂志中阅读有关WCF: Working with One-Way Calls, Callbacks and Events的更多信息。