вторник, 23 февраля 2010 г.

ASMX и private set

Почти целый день убил на дурацкую проблему. Мой веб-сервис перестал возвращать некоторые данные. Постепенно выяснилось, что из WSDL исчезла часть полей. Перезагрузка IIS, удаление старых DLL не помогали. Оказалось, что я объявил пропавшие поля как { get; private set }, а надо было { get; set }. Смутно вспоминаю, что вроде бы раньше было положено, чтобы и геттер, и сеттер были общедоступны, а потом это отменили. В моем случае поля только сериализуются, десериализацию делать не надо, поэтому вроде как общедоступный сеттер не нужен. Вот я его и объявил private.

Но что интересно - версия с private отлично работала на моем компьютере, на сервере разработки и на сервере тестировщиков. И только когда её развернули на серверах стресс-теста, то проблема вылезла. Вывод: очень важно не только синхронизировать базы и код перед тестированием, но и убедиться, что все патчи накатили на все сервера. Либо не накатили, но тоже на все (хоть и безобразие, но однообразие). Но я не знаю простого способа, как этого добиться...

Нашел описание этой проблемы на http://support.microsoft.com/kb/952883/ (правда, они говорят про internal, а не private, но я думаю, что это неважно). Вот что пишут:

You have a computer that has the Microsoft .NET Framework 2.0 Service Pack 2 (SP2) or the .NET Framework 3.5 SP1 installed. You use an ASMX service method that includes a property, and the property has an internal setter. The serialization may fail (здесь и далее курсив мой - Валик).
...
A supported hotfix is now available from Microsoft. However, it is intended to correct only the problem that is described in this article. Apply it only to systems that are experiencing this specific problem. This hotfix may receive additional testing. Therefore, if you are not severely affected by this problem, we recommend that you wait for the next software update that contains this hotfix.

Т.е. проблема проявляется только на некоторых компьютерах, и не факт, что хотфикс ничего не испортит. Ужас. Этот тот самый тип ошибки, которая страшнее всего для программиста.

Комментариев нет:

Ratings by outbrain