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 }
}

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

好吧,在经历了整个过程之后(感谢所有的提示),解决方案是:

  • 根本不需要DataContract中的IsReference属性
  • 即使OperationContract返回void,也根本不需要DataContract中的IsOneWay属性
  • 也不需要KnownType,前提是层次结构中的所有子类型都是我的,换句话说,由我而不是.NET定义,并酌情用DataContractDataMember标记
  • 去掉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的信息:使用单向调用、回调和事件。