首页 文章

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

提问于
浏览
6

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

  • 0

    将属性添加到'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以传回响应 . 这样您就可以确保所有类型都可以在 Contract 中轻松定义 .

  • 0

    好了,经历了整个事情(感谢大家的提示)解决方案是这样的:

    根本不需要 DataContract 中的

    • IsReference 属性
      即使 OperationContract 返回无效,也根本不需要 DataContract 中的

    • IsOneWay 属性 .
      如果层次结构中的所有子类型都是我的,也不需要

    • KnownType ,换句话说,由我而不是.NET定义,并在适当时用 DataContractDataMember 标记

    • 摆脱 OperatingSystem 并构建一个从 OperatingSystem 中提取所需信息的包装 DataContract 解决了这个问题 .

    现在WCF测试客户端没有错误

  • 5

    如果您创建测试客户端(如控制台应用程序)并向wcf添加服务引用,该服务是否有效?如果是,那么您的datacontract可能具有WCF测试客户端不支持的那些类型之一 .

    See this related issue

  • 4

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

    如果你想使用 void (如:没有返回值),你需要用这些方法来装饰

    [OperationContract(IsOneWay = true)]
    void DoSomething(UserData data);
    

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

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

相关问题