1

这个问题与这个问题非常相似:并非WCF数据协定中的所有参数都通过web服务调用实现然而,那里提供的答案并没有解决我的问题。

这是我的服务代码:

使用系统。运行时。系列化;使用系统。服务模型;命名空间SoapUiToWcf{[服务合同]公共接口IWcfTest{【运营合同】WcfData返回请求(WcfData WcfData);}[数据合同]公共类WcfData{[数据成员(顺序=1)]公共WcfDataNested NestedData{get;set;}公共类WcfDataNested{[数据成员(顺序=2)]公共字符串Foo{get;set;}[数据成员(顺序=3)]公共字符串Bar{get;set;}}}公共类WcfTest:IWcfTest{公共WcfData ReturnRequest(WcfData WcfData){return wcfData;}}}

服务应该返回发送给它的相同数据。当我通过发送请求时肥皂用户界面有了下面的数据,一切正常,我得到了所有已发送的值:

<soapenv:Envelope><soapennv:Header/><soaphenv:Body><tem:ReturnRequest><tem:wcfData><soap:NestedData><soap:Bar>Bar</soap:Bar><soap:Foo>Foo</soap:NestedData></tem:wcfData></tem:ReturnRequest></soapenv:Body>

但如果我换了酒吧-和-字段中,wcf服务只接收foo-value,另一个为null:

<a:Bar i:nil=“true”/><a:Foo>Foo

编辑

屏幕截图1(SoapUI中的请求和响应):在此处输入图像描述

屏幕截图2(在Visual Studio中调试):在此处输入图像描述

为了不依赖于请求中字段的排序顺序,我必须如何实现wcf服务?

2
  • 2
    在DataContract中请求特定订单。代码只是做了你要求它做的事情。如果有什么问题,你应该问“为什么WCF没有丢弃消息?” 评论 2014年7月10日13:21
  • 编辑:我从DataMember装饰中删除了所有订单属性,但如果“bar”位于soap-request中的第二个位置,我仍然缺少提交字段“bar”的值
    – 鲁迪
    评论 2014年7月10日16:25

2个答案2

重置为默认值

WCF希望您按顺序发送。如果不指定顺序,则默认为以字母顺序结尾的一些复杂规则。我想当你取消订单时,它会首先要求酒吧。事实上,这并不意味着在SoapUI调用之前没有刷新某些内容。看看另一条线索:https://stackoverflow.com/a/2520005/2540156

  • 我并不是在寻找交付的字段的特定顺序,相反,在我的wcf服务中,我想接收客户端发送的所有值,但事实并非如此,这几乎让我发疯
    – 鲁迪
    评论 2014年7月10日16:42
  • 1
    我没有意识到我链接了与@Adam47相同的线程。他所说的与我得出的结论相同:您的客户需要遵循XML约定并序列化Wcf嵌套数据字段按字母顺序排列。我很难相信任何现代的内置XML序列化程序在默认情况下都不会这样做。当然,客户要“随机化”他们的字段,而不仅仅是把它们整理好。
    – 基尔宁
    评论 2014年7月10日19:04
  • 1
    您并不是这样寻找它们,但WCF在反序列化它们时是这样寻找它们的。他们这样做很可能是为了优化性能。这是WCF中许多小复杂性之一,这使得人们想要将WebAPI与JSON结合使用。WCF仍然有它的位置,但如果我正在构建一个内部服务,我不会选择WCF,除非它增加了一些价值。
    – 亚当47
    评论 2014年7月10日20:59
2

如果您只需删除订单属性数据成员WcfData对象上的修饰符,它不需要任何特定的顺序。

[数据合同]公共类WcfData{[数据成员]公共WcfDataNested NestedData{get;set;}公共类WcfDataNested{[数据成员]公共字符串Foo{get;set;}[数据成员]公共字符串栏{get;set;}}}

编辑:从…的声音如果不按字母顺序序列化(XML约定),那么在WCF反序列化类时可能会丢弃顺序不正确的字段。

5
  • 谢谢你的回答,但这并没有改变我奇怪场景的行为(见我编辑过的答案)
    – 鲁迪
    评论 2014年7月10日14:27
  • 为什么您的请求不按字母顺序与字段一起发送?我只是想了解你想解决的问题。
    – 基尔宁
    评论 2014年7月10日16:08
  • 我的客户以随机顺序发送他们请求中的字段。如果请求中的“Bar”标记出现在“Foo”标记上方,则我仅接收属性“Bar“的值。如果我将“Bar”标记放在“Foo”标记的下方,则在函数“ReturnRequest”中缺少“Bar“的值。我就是不明白为什么会这样
    – 鲁迪
    评论 2014年7月10日16:34
  • 1
    stackoverflow.com/questions/2519240/…我认为这解决了你的问题。您客户的序列化程序需要以字母顺序发送字段,否则可能会被丢弃(即以无效的)反序列化时。 评论 2014年7月10日19:01
  • 谢谢你的链接。我对WCF很陌生,没有意识到字段必须按特定顺序到达
    – 鲁迪
    评论 2014年7月14日15:22

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问自己的问题.