【问题标题】:Removing nill="True" from WCF Request从 WCF 请求中删除 nill="True"
【发布时间】:2015-03-18 09:19:01
【问题描述】:

我在我的应用程序中使用 WCF Web 服务,同时我正在发送一个请求,我使用 fiddler 监视请求和响应。问题在于空标签,wcf 客户端生成 nil=true 属性。无论如何我可以将它们更改为空白标签吗? 这是一个例子

<a:Seats i:nil="true" />

这是Seat类的列表,它是可选标签,所以不需要传递它。但是当我发送上述请求时,我会收到来自网络服务的Object reference not set to an instance of an object 响应。我被要求从请求中删除 nill 属性。所以一定要变成这个样子

<a:Seats/>

添加EmitDefaultValue=false 将完全删除标签,因此它不是答案。我怎样才能做到这一点 ?

【问题讨论】:

  • “空白标签”是什么意思?
  • 为什么你需要这个? i:nil=true 只是简单地声明这个属性没有价值......为什么这是一个“问题”??
  • @Jocke 空白像
  • @marc_s 我不知道为什么 i:nill=true 会造成问题。即使在服务器端没有指定它,它也应该被忽略,但因为他们建议我删除它,我需要这样做。
  • @Behzad 他们是谁?为什么他们相信删除i:nil="true"会解决问题?!无论如何,为什么不用零元素初始化集合而不是发送空集合(这是最佳实践,请参阅:stackoverflow.com/questions/1969993/…

标签: c# wcf


【解决方案1】:

如果我正确理解您的情况,您希望将“座位类别列表”(例如 List&lt;Seat&gt;)表示为“空”而不是 null

WCF 序列化程序只允许将对象序列化为“空白”值,前提是该对象具有“有效”空白值(例如,string 可以为空白或 null)。 xsi:nil 表示一个没有内容的元素是有效的,即使该底层对象的数据类型不允许空元素。

如果您想强制 WCF 客户端发送空元素,您可以实现自定义消息检查器以在发送之前修改消息。

请参阅 How to inspect and modify WCF message via custom MessageInspector 了解更多信息。

【讨论】:

    【解决方案2】:

    我自己想办法,

    我重新配置ServiceReference并将集合类型更改为System.Collection.Generic.List(最初是System.Array

    然后当我想发出请求时,只需像下面这样初始化请求对象

    rq.Seats = new List<Seat>();   // result <a:Seats/>
    

    我知道它很奇怪,但是当它是数组时结果不同

    rq.Seats = new seat[] { } ;    //result <a:Seats nil="true" />
    

    【讨论】:

      【解决方案3】:

      我自己想办法。

      为了避免 WCF 请求中的 NULL xml 元素出现此问题

      使用 XML 节点上方的属性

       [XmlElement(IsNullable = true)]
      

      【讨论】:

      • DataContractSerializer 不使用该属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多