【问题标题】:Culture-related issue with WCF and System.DoubleWCF 和 System.Double 的文化相关问题
【发布时间】:2010-01-12 21:49:44
【问题描述】:

我的问题类似于这个问题但不完全相同:Change culture when deserializing WCF service

我使用 VS 2008 构建了一个在 Windows 7 (IIS 7.5) 上运行的 WCF (web) 服务。我的 web 服务中的一个属性被键入为 System.Double。在构建我自己的客户端以测试服务时,Visual Studio 要求我编写 - 例如 - 像 123.4 这样的数字(使用点作为小数点)。但是,当使用 WcfTestClient.exe 访问服务并在字段上输入一个数字(如 123.4,仍然使用点)时,它会给我消息“123.4 不是这种类型的有效值”。我应该提到我住在瑞典,逗号是这里特定文化的小数点符号。

如果我在使用 WcfTestClient 时使用逗号 (,) 作为小数点,则可以接受。问题是,当我调试我的 web 服务代码时,我可以看到逗号被序列化过程以某种方式删除,并且数字已更改为 1234。不好。

在我的开发环境中,服务和客户端都在同一台机器上运行。网络服务在使用相同语言环境的 NetworkService 帐户下运行。

我的问题是:我如何在 WCF 中确保在此字段/属性上提供给 web 服务的任何数字,如果包含逗号,则不应删除逗号?

我认为这是在框架中自动处理的。只要值保持不变,我真的不在乎数字是用逗号还是点存储。

我正在使用 DataContractSerializer 和自动实现的属性,如下所示:[DataMember] public double Price { get; set; }

我还测试了在 setter 中使用 Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture) 构建属性,而 WCF 服务中的结果没有明显变化。

【问题讨论】:

    标签: wcf serialization


    【解决方案1】:

    您能分辨出是 wcf 测试客户端还是您的 Web 服务弄乱了序列化?也许尝试在 WCF 中启用完整的消息记录并检查传入的消息正文以查看它是否包含“1234”或“123,4”或“123.4”。也许(希望)它只是 WCF 测试客户端中的一个错误。

    链接到 MSDN 页面以设置消息记录:http://msdn.microsoft.com/en-us/library/ms730064.aspx 并设置:

    logEntireMessage="true"
    logMessagesAtServiceLevel="false" 
    logMessagesAtTransportLevel="true"
    

    我认为这应该会给您一个包含原始传入消息的服务日志。如果您启用了传输级别安全性 (SSL),您可能必须关闭它。

    【讨论】:

    • 我已经尝试过消息记录。 Trace Viewer 中的文件仅显示加密消息。我在绑定上使用消息和传输安全模式进行了测试,但消息保持加密状态。如果我尝试 客户端由于某种原因挂起。
    • 我现在设法获取以未加密形式存储的消息。我可以看到该值存储在删除了小数点 1234 的情况下。我不相信这是 Wcf 测试客户端中的错误。我在这个论坛(第一个答案)看到了一些关于文化问题的解释(与 WCF 无关):velocityreviews.com/forums/…
    【解决方案2】:

    System.Decimal 也有同样的问题。 您可以在 WcfTestClient 的 XML 选项卡中看到,发送的数据确实没有小数分隔符。

    但是,该错误似乎存在于您使用的计算机的区域设置中。

    我将区域设置更改为使用“.” (点)作为数字的分隔符,并且能够成功测试它。现在您可以看到发送的数据(再次在 XML 选项卡中)并且在调试我的服务时包含正确的分隔符。

    【讨论】:

      【解决方案3】:

      这个问题是由于使用了数据类型 Double。Double 值类型表示一个双精度 64 位数字,其值范围从负 1.79769313486232e308 到正 1.79769313486232e308。它旨在表示极大(例如行星或星系之间的距离)或极小(以千克为单位的物质的分子量)的值。查看更多here

      在这种情况下,当我尝试使用双参数从 WCF 测试客户端测试 WCF 服务时,必须是较小的数字 9.9999999999,因为小数点已被删除。 在本例中,我将参数值设为 9.947814E+22,如果我们单击 XML 选项卡,我们可以看到逗号没有被删除。

      因此建议在使用较高十进制值时将参数的数据类型从Double更改为decimal。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        相关资源
        最近更新 更多