操作在WCF测试客户端

问题描述:

我创建了一个WCF服务不支持和默认服务我加在主DataContract另一经营合同:操作在WCF测试客户端

[OperationContract] 
void DoSomething(UserData data); 

然后,我有这样的事情(简化的目的例如)。问题是,即使层次结构中的所有类都使用DataContract装饰了所有的成员,并且使用DataMember装饰了它们的所有成员,但当我使用WCF Test Client时,它具有一个红色图标,指示“该操作在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 } 
} 
+1

我看到两个类具有相同的名称,但一个缺少复合型没有错误,你这是什么意思?你也忘了发布复合类型的类。 – Silvermind 2012-03-23 21:45:02

+0

我看到你在谈论层次结构。你正在实现任何种类的递归关系?因为这将需要递归使用的类用'[DataContract(IsReference = True)]'装饰' – Silvermind 2012-03-23 23:27:30

+0

@ Silververmind抱歉错别字错误,第二个(已更正)是CompositeType而不是UserData。 我还将IsReference参数添加到主DataContract中使用的子类型,但未解决问题。 – 2012-03-26 01:59:10

属性添加到您的 '的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以在回复中传回。这样你可以确保所有类型都很容易在你的合同中定义。

+0

我已将KnownType装饰添加到父类型中,以指示DataMembers的返回值中使用的自定义类的类型,对于层次结构中的那些类,这些自定义类基本上都不是用[KnownType]标记的DataContract。问题依然存在。 – 2012-03-26 04:34:14

+0

@LordofScripts你可以创建一个示例项目并将其上传到某处,以便我(和其他人)可以看一看。 – Phill 2012-03-26 04:36:12

+0

这是ISampleService.cs – 2012-03-26 05:29:30

如果您创建测试客户端(如控制台应用程序)并将服务引用添加到wcf,服务是否可以正常工作?如果确实如此,那么您的数据合同可能具有WCF Test客户端不支持的其中一种类型。

See this related issue

+0

我在相关问题中看到的URL是.../Name.svc类型,而WCF Test Client向我显示以下URL: http:// localhost:8731/Design_Time_Addresses/My.WebServices/RegistrationService/mex 如果我在IE上使用它,它什么也没有显示。 – 2012-03-26 02:03:32

为服务调用WCF的默认期望是请求 - 响应 - WCF预期某种回应的背部。

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

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

告诉WCF运行时期望从调用

任何返回值

在MSDN杂志中阅读更多关于WCF: Working with One-Way Calls, Callbacks and Events

+0

我从来不需要在WCF合同中使用正常绑定的'IsOneWay == true',是不是更适合DualBinding,因为双通道可以向客户端发送独立响应? – Silvermind 2012-03-23 23:22:57

+0

您不必设置IsOneWay = true,并且您应该知道,如果您这样做,客户端将不会收到服务器抛出的任何错误异常,因为它不会等待wcf服务将返回的void响应以允许错误异常被传回。 – 2012-03-24 00:17:08

+0

这也没有做任何事,同样的问题。我的操作合同有一个我定义的类型的单个参数,用DataContract标记。该自定义类型具有多个用DataMember标记的属性,每个属性都是自定义的(但相当简单)类型,所有这些子类型在其声明中标记为DataContract。 – 2012-03-26 03:27:10

OK,通过整个事情已经走了(感谢所有的提示)解决方案是这样的:

并不需要在所有
  • IsOneWay并不需要
  • 在DataContract属性在DataContract
    • IsReference属性甚至在OperationContract返回void时也是如此。
    • 只要层次结构中的所有子类型都是我的,换句话说就是由我定义的,KnownType也是不需要的。NET并用DataContract或DataMember标记
    • 摆脱OperatingSystem并构建包装DataContract从OperatingSystem中提取必要的信息解决了问题。

    现在有在WCF测试客户端

    +1

    嗨,坚持一个类似的问题。 “摆脱OperatingSystem并构建一个从OperatingSystem提取必要信息的包装DataContract解决了这个问题,你到底意味着什么。” – Neeraj 2015-04-27 19:50:25

    +0

    卡住了,我们可以得到更新吗? – Feign 2015-05-14 19:54:04