WCF和System.Double与文化相关的问题

时间:2010-01-12 21:49:44

标签: wcf serialization

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

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

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

在我的开发环境中,我在同一台机器上运行服务和客户端。 Web服务在NetworkService帐户下运行,该帐户使用相同的区域设置。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

但是,该错误似乎在您使用的计算机的区域设置范围内。

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

答案 2 :(得分:0)

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

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

enter image description here

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