WSDL неправильно интерпретирует родовой - PullRequest
1 голос
/ 22 апреля 2009

Я разрабатываю платформу для использования кодов ошибок в уже очень развитом приложении.

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

Теперь методы веб-службы передают три вида объектов: целые, строки и наборы данных

Для целых чисел и строк легко передать код ошибки (int может быть реальным кодом, а строка может просто каким-то образом добавить код в конец). Однако с набором данных все не так просто. Поэтому была распространена идея использовать универсальный контейнер и поместить в него набор данных и код ошибки.

Вот где проблема:

Когда я создал универсальный контейнер и попытался его использовать, я получил следующую ошибку:

(Lets assume my generic class is called ErrorHandler<DatasetType>)

"Cannot convert ErrorHandlerofDatasetType to type ErrorHandler<DatasetType>"

Я предполагаю, что WSDL неправильно интерпретирует класс или что-то в этом роде. Может кто-нибудь пролить свет на это?

РЕДАКТИРОВАТЬ: Я должен, вероятно, упомянуть, что это для решения .NET 2.0.

1 Ответ

2 голосов
/ 22 апреля 2009

В вашем WSDL нет ничего плохого.

WSDL зависит от схемы XML для описания формы данных. Схема XML не имеет понятия обобщения.

Когда .NET видит ваш запрос на создание WSDL и видит, что вы используете универсальный тип, он должен сгенерировать имя типа, которое он может использовать в схеме XML. Отсюда и возникает ErrorHandlerOfDatasetType.

При создании прокси-кода клиента проверяется схема XML в WSDL. Генератор кода увидит комплексный тип с именем ErrorHandlerOfDatasetType и, естественно, сгенерирует класс с именем ErrorHandlerOfDatasetType.

Теперь вы, похоже, пытаетесь привести этот прокси-класс к ErrorHandler, что явно не так. Если вы используете «веб-ссылку» (вы не сказали), то в вашем клиенте не должно быть никаких типов данных сервера. Веб-сервисы ASMX не созданы таким образом.

Если вы используете WCF (и вы должны это сделать), тогда вы можете установить диалоговое окно «Добавить ссылку на службу» для обмена типами между клиентом и службой. Если честно, я не думаю, что это поможет вам с обобщениями, потому что, как я уже сказал, информация, необходимая для того, чтобы знать, что ErrorHandlerOfDatasetType действительно означает, что ErrorHandler просто не существует.

Обратите внимание, что даже в WCF использование типа сервера создает зависимость от версии сборки сервера и часто является плохой идеей.

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