操作在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 }
}
属性添加到您的 '的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以在回复中传回。这样你可以确保所有类型都很容易在你的合同中定义。
我已将KnownType装饰添加到父类型中,以指示DataMembers的返回值中使用的自定义类的类型,对于层次结构中的那些类,这些自定义类基本上都不是用[KnownType]标记的DataContract。问题依然存在。 – 2012-03-26 04:34:14
@LordofScripts你可以创建一个示例项目并将其上传到某处,以便我(和其他人)可以看一看。 – Phill 2012-03-26 04:36:12
这是ISampleService.cs – 2012-03-26 05:29:30
如果您创建测试客户端(如控制台应用程序)并将服务引用添加到wcf,服务是否可以正常工作?如果确实如此,那么您的数据合同可能具有WCF Test客户端不支持的其中一种类型。
我在相关问题中看到的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。
我从来不需要在WCF合同中使用正常绑定的'IsOneWay == true',是不是更适合DualBinding,因为双通道可以向客户端发送独立响应? – Silvermind 2012-03-23 23:22:57
您不必设置IsOneWay = true,并且您应该知道,如果您这样做,客户端将不会收到服务器抛出的任何错误异常,因为它不会等待wcf服务将返回的void响应以允许错误异常被传回。 – 2012-03-24 00:17:08
这也没有做任何事,同样的问题。我的操作合同有一个我定义的类型的单个参数,用DataContract标记。该自定义类型具有多个用DataMember标记的属性,每个属性都是自定义的(但相当简单)类型,所有这些子类型在其声明中标记为DataContract。 – 2012-03-26 03:27:10
OK,通过整个事情已经走了(感谢所有的提示)解决方案是这样的:
并不需要在所有- IsReference属性甚至在OperationContract返回void时也是如此。
- 只要层次结构中的所有子类型都是我的,换句话说就是由我定义的,KnownType也是不需要的。NET并用DataContract或DataMember标记
- 摆脱OperatingSystem并构建包装DataContract从OperatingSystem中提取必要的信息解决了问题。
现在有在WCF测试客户端
我看到两个类具有相同的名称,但一个缺少复合型没有错误,你这是什么意思?你也忘了发布复合类型的类。 – Silvermind 2012-03-23 21:45:02
我看到你在谈论层次结构。你正在实现任何种类的递归关系?因为这将需要递归使用的类用'[DataContract(IsReference = True)]'装饰' – Silvermind 2012-03-23 23:27:30
@ Silververmind抱歉错别字错误,第二个(已更正)是CompositeType而不是UserData。 我还将IsReference参数添加到主DataContract中使用的子类型,但未解决问题。 – 2012-03-26 01:59:10