Культурная проблема с WCF и System.Double - PullRequest
2 голосов
/ 13 января 2010

Моя проблема похожа на этот вопрос, но не совсем так: Изменение культуры при десериализации службы WCF

Я создал WCF (веб-службу), работающую в Windows 7 (IIS 7.5) с использованием VS 2008. Одно из свойств моего веб-сервиса имеет тип System.Double. При создании собственного клиента для тестирования службы Visual Studio запрашивает у меня, например, написать число, например 123,4 (с использованием точки в качестве десятичной точки). Но при использовании WcfTestClient.exe для доступа к службе и ввода числа в поле (например, 123.4, все еще используя точку), я получаю сообщение «123.4 - недопустимое значение для этого типа». Я должен упомянуть, что я живу в Швеции, а запятая - это символ десятичной точки, специфичный для данной культуры.

Если вместо использования WcfTestClient я использую запятую (,) в качестве десятичной точки, это принимается. Проблема заключается в том, что когда я отлаживаю свой код веб-сервиса, я вижу, что процесс сериализации каким-то образом удаляет запятую, а число изменяется на 1234. Не хорошо.

В моей среде разработки у меня и служба, и клиент работают на одной машине. Веб-сервис работает под учетной записью NetworkService, которая использует ту же локаль.

Мой вопрос: как мне в WCF убедиться, что любой номер, указанный в этом поле / свойстве для веб-службы, если он содержит запятую, НЕ должен быть удален через запятую?

Я думал, что это автоматически обрабатывается в рамках. Меня не волнует, хранится ли число с запятой или точкой, если значение остается неизменным.

Я использую DataContractSerializer и автоматически реализуемые свойства, например: [DataMember] public double Price { get; set; }

Я также протестировал создание свойства с использованием Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture) в установщике без видимых изменений в результате в службе WCF.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2010

У меня была такая же проблема с System.Decimal. На вкладке XML WcfTestClient вы могли видеть, что отправленные данные действительно были без десятичного разделителя.

Однако, похоже, ошибка находится в пределах ваших региональных настроек используемого вами компьютера.

Я изменил свои региональные настройки, чтобы использовать "." (точка) в качестве разделителя для чисел и смог успешно проверить его. Теперь вы можете видеть, что отправленные данные (снова на вкладке XML) и при отладке моего сервиса содержали правильный разделитель.

0 голосов
/ 08 июля 2014

Эта проблема возникает из-за использования типа данных Double. Тип значения Double представляет 64-разрядное число двойной точности со значениями в диапазоне от отрицательного 1.79769313486232e308 до положительного 1.79769313486232e308. Он предназначен для представления значений, которые чрезвычайно велики (например, расстояния между планетами или галактиками) или чрезвычайно малы (молекулярная масса вещества в килограммах). Подробнее здесь .

В этом случае, когда я пытаюсь протестировать службу WCF из WCF Test Client с двойным параметром, должно быть меньшее число 9.9999999999, потому что десятичная точка удалена. В этом примере я указал значение параметра 9.947814E + 22, и если мы перейдем на вкладку XML, мы увидим, что запятая не удалена.

enter image description here

Поэтому рекомендуется работать с типом данных параметра с Double на decimal при работе с более высокими десятичными значениями.

0 голосов
/ 13 января 2010

Можете ли вы сказать, что это не тестовый клиент 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), если она включена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...