Клиент веб-службы C #: несколько методов веб-службы с одинаковым (сложным) типом возврата? - PullRequest
7 голосов
/ 24 февраля 2009

В данный момент я делаю выборку для создания клиента для веб-службы Java B2B и думаю, что уже определил причину проблемы, с которой мы столкнулись в течение достаточно долгого времени. К сожалению, я не могу опубликовать WSDL.

Очевидно, что мой автоматически сгенерированный прокси-код (через wsdl.exe: приходится использовать WSE 3.0 из-за WCF, не поддерживающего дайджест пароля) не может обрабатывать WSDL веб-службы, имеющей несколько веб-методов с одним и тем же сложным типом возврата. .

Возьмем, к примеру, веб-сервис, который определяет следующие методы:

Public ComplexTypeX Blah();
Public ComplexTypeX Blue();
Public ComplexTypeX Foo();
Public ComplexTypeY Bar();

В моем файле Reference.cs, если я закомментирую весь код, который вызывает любые два из Blah (), Blue () или Foo (), то оставшийся незакомментированный метод не может быть вызван. Однако, если у меня есть более одного из этих трех методов, не закомментированных (скажем, Blah () и Foo ()), то я получаю следующее сообщение об ошибке при создании клиентского кода веб-службы:

«Метод Бла не может быть отражен». «Элемент XML« ComplexTypeX »из пространство имен 'http://some.url' ссылки метод и тип. Изменить имя сообщения метода с использованием WebMethodAttribute или измените корневой элемент типа, используя XmlRootAttribute. "

Теперь определенно нет метода ComplexTypeX, определенного как часть веб-службы, поэтому я могу только предположить, что .NET (или, по крайней мере, wsdl.exe) не позволяет вам использовать веб-службу, которая возвращает сложные (определяемые пользователем) типы одного типа в нескольких методах ... правильно?

Ответы [ 6 ]

8 голосов
/ 03 июля 2010

Я столкнулся с подобной проблемой, и вот что я нашел:

Я определил сложный тип для возврата в качестве ответа:

public class FooResponse {...}

[WebMethod]
public FooResponse Foo() {...}

Обратите внимание, что здесь важно точное сочетание имен Foo / Foo + Response. Когда я изменил имя метода следующим образом, проблема исчезла:

public class FooResponse {...}

[WebMethod]
public FooResponse Fooxxx() {...}

Я считаю, что .NET пытается автоматически обернуть ответ, полученный от метода Foo, элементом с именем FooResponse. Использование того же имени в качестве объекта, который вы хотите вернуть, создает неоднозначность. Попробуйте изменить имя объекта ответа или имя метода, чтобы избежать этого столкновения.

3 голосов
/ 22 июля 2009

Я просто искал "ссылается на метод и тип" и нашел отчет об ошибке Connect " System.InvalidOperationException: элемент XML * из пространства имен * ссылается на метод и тип ". В этом случае есть операция и элемент с одинаковым именем (локальное имя и пространство имен).


Стоит отметить часть ответа от Microsoft:

Мы больше не вносим улучшения в ASMX; мы продолжаем поддерживать его существующую функциональность, но там, где это возможно, мы рекомендуем использовать WCF.

1 голос
/ 27 ноября 2012

Я нашел еще один случай, который поднимает ошибку! Вот мой код:

[WebMethod]
public CheckUpdateResponse CheckUpdate()
{
...
}

Хорошо, позвольте мне объяснить: тип возвращаемого значения CheckUpdateResponse - это структура, CheckUpdate() - это метод. Итак, в WSDL .NET автоматически добавьте суффикс "Response" к имени метода CheckUpdate в одном из элементов XML, чтобы описать возвращаемое значение метода.

Et voilà: он нашел дубликат элемента и выдает ошибку "Измените имя сообщения метода, используя WebMethodAttribute ..."

Решение ? Я переименовал тип возвращаемого значения в «CheckUpdateResult», и теперь все работает хорошо!

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 22 июля 2009

Использование WSDL.exe имеет переключатель / sharetypes . Это должно решить проблему.

Более того, я бы не согласился с тем, что это вещь Microsoft, поскольку одни и те же классы выставляются как разные сложные типы, сидящие в нескольких wsdl. Это не хороший абстрактный дизайн.

Готовая справочная документация Microsoft для общих типов Включает функцию обмена типами. Эта функция создает один файл кода с определением одного типа для идентичных типов, совместно используемых различными службами (пространство имен, имя и проводная подпись должны быть идентичны). Ссылка на службы с URL-адресами http: // в качестве параметров командной строки или создание документа discomap для локальных файлов.

0 голосов
/ 24 февраля 2009

Очень странно. Обычно WSDL предоставляет общий тип, и при компиляции через wsdl.exe или svcutil.exe вы получите общий общий тип, который можно использовать для любого количества методов в одном интерфейсе.

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

Но вы говорите о чем-то другом.

0 голосов
/ 24 февраля 2009

, поэтому я могу только предположить, что .NET (или, по крайней мере, wsdl.exe) не позволяет вам использовать веб-сервис, который возвращает сложные (определяемые пользователем) типы одного типа по нескольким методам ... верно?

Это неверно. Представьте, сколько боли будет, если бы это было правдой - у вас мог бы быть только один метод, который возвращает String, метод, который возвращает Double, метод, который возвращает SomeObject и т. Д. ... это было бы кошмаром.

Я не очень знаком с веб-сервисами в .NET, но из-за ошибок, которые вы получаете, это звучит так, как будто у вас возникают проблемы с пространствами имен XML - возможно, существует конфликт имен. Я бы попытался следовать предложению в сообщении об ошибке, чтобы изменить WebMethodAttribute.

Кроме того, если вы не можете опубликовать часть кода / документа, относящуюся к вашей проблеме из-за некоторых проблем с конфиденциальностью / конфиденциальностью, вы должны опубликовать исправленную версию, которая все еще подтверждает ваш тестовый пример. Почти все, что «чувствительно», должно быть в состоянии сводиться к гораздо более простому фрагменту кода, который по-прежнему позволяет понять вашу точку зрения, не изменяя чувствительности.

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