【问题标题】:Deserializing SOAP-response with empty or invalid date element使用空或无效的日期元素反序列化 SOAP 响应
【发布时间】:2012-02-03 11:10:25
【问题描述】:

我正在使用 SAP-NetWeaver Web 服务。响应对象包含一个数据,如果未设置,则返回“0000-00-00”。这会导致我的 .NET 4.0 WCF 代理出现反序列化错误,因为 .NET 的最短有效日期为“0001-01-01”。

我要求 SAP 开发人员使用 minoccurs="0" 属性装饰 date 元素,如果不存在任何值,则将其省略,但他说他不能这样做。

在我要求他为空日期返回“0001-01-01”之前 - 仅针对我的 WCF 代理 - 我想知道:

  1. 就 SOAP 而言,“0000-00-00”是有效日期吗?在任何 SOAP 规范中都找不到它,所以请告诉我您的信息来源。

  2. 有没有办法告诉 .NET 反序列化程序接受“0000-00-00”并像 DateTime.MinValue 一样处理它?

非常感谢!

更新: 现在,如果日期为空,SAP-web-service 返回一个空元素。但我的问题还是一样。

【问题讨论】:

    标签: .net wcf soap deserialization


    【解决方案1】:

    关于这个有一个很好的谈话

    here

    可以简单地实现类的自定义反序列化。这样“0000-00-00”的值就会被捕获并转换为 DateTime.MinValue。 UPD:这是我一直在谈论的代码。

    [OnDeserializing]
    void OnDeserializing(StreamingContext c)
    {
      if (MyCustonObj == null)
      {
        MyCustonObj = new MyCustomClass();
        MyCustonObj.MyStrData = "Overridden in  deserializing";
      }
    }
    

    【讨论】:

    • 谢谢,但是如果您在接受的答案中指向 OnDeserializedAttribute,那么我认为这不会在这里起作用,因为据我所知,反序列化错误会在使用 OnDeserializedAttribute 装饰的方法之前发生将被调用。
    • @mono68 答案中也有一个 OnDeserializingAttribute,我认为是时候对反序列化过程进行更正了。 OnDeserializedAttribute 顾名思义,就是在反序列化之后立即实现的。
    • 感谢您的更新,但我需要一个更具体的示例来说明如何检查响应消息以确定是使用默认值覆盖日期字段还是让反序列化发生.
    • @mono68 你能告诉我你如何将服务引用添加到应用程序吗?
    • @lgarioshka 通过添加服务参考。我可以使用 svcutil 生成代理类,尽管这将是一项非常复杂的任务,因为该服务需要基本身份验证,我必须手动下载 WSDL。
    【解决方案2】:

    您可以实现 SOAP 扩展以在 SOAP 被反序列化之前对其进行更改:

    http://msdn.microsoft.com/en-us/library/7w06t139.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2012-02-25
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多