Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Метод "XYZ" не может быть отражен

Автор вопроса: Andy RoseОтветов: 9

Мы воспользовались сторонней веб-службой и пытаемся вызвать ее из веб-приложения ASP.NET. Однако, когда я создаю экземпляр веб-службы, возникает следующее исключение System.InvalidOperationException:

Метод "ABC.XYZ" не может быть отражен. System.InvalidOperationException: метод "ABC.XYZ" не может быть отражен. ---> System.InvalidOperationException: элемент XML "MyDoc" из пространства имен "http://mysoftware.com/ns' ссылается на метод и тип. Измените имя сообщения метода с помощью WebMethodAttribute или измените корневой элемент типа с помощью XmlRootAttribute.

Из того, что я могу понять, существует некоторая двусмысленность между методом и типом в веб-службе. Может ли кто-нибудь прояснить возможную причину этого исключения, и есть ли что-нибудь, что я могу сделать, чтобы исправить это, или я должен просто обратиться к владельцам веб-сервисов, чтобы исправить это?

Изменить: Visual Studio 2008 создал прокси-класс. К сожалению, я не могу предоставить ссылку на wsdl, так как это веб-служба для локально установленного стороннего приложения.

exceptionreflectionweb-services

Ответы

Ответ 1 · рейтинг 14 · kdanylo

Я столкнулся с той же проблемой ранее сегодня. Причина была в том, что класс, сгенерированный Visual Studio и переданный в качестве параметра в один из методов, не имел конструктора без параметров по умолчанию. Как только я добавил его, ошибка исчезла.

Ответ 2 · рейтинг 3 · Andy Rose

Похоже, проблема связана с проблемами типа данных между VS и веб-службой, написанной на Java.

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

Ответ 3 · рейтинг 2 · Dean

Я столкнулся с той же проблемой, когда использовал сторонний веб-сервис. Проблема в данном случае заключалась в том, что свойство mustUndertand в справочном файле искало логическое значение, а свойство пространства имен искало строку.

Просматривая ссылку, я смог идентифицировать оскорбительное свойство и просто добавить "переопределения" в сигнатуру метода.

Не идеально, так как каждый раз, когда вы обновляете службу, вы должны это делать, но я не мог найти другого способа обойти это.

Чтобы найти эталонный файл, выберите "все файлы" в обозревателе решений.

Надеюсь это поможет

Ответ 4 · рейтинг 1 · Richard

Я предполагаю, что wsdl, испускаемый или поставляемый службой, не находится в форме, которую могут понять wsdl.exe или serviceutil. Можете ли вы опубликовать wsdl или ссылку на него?

как вы создаете прокси-классы?

Также вы можете попробовать проверить wsdl по схеме wsdl, чтобы проверить ее действительность.

Ответ 5 · рейтинг 1 · Tod Flak

В моем случае я получал ошибку "метод не может быть отражен" из-за того факта, что в классе, возвращаемом методом, мне не удалось предоставить конструктор по умолчанию без параметров.

Я работал в VB.NET. В моем возвращаемом классе я объявил метод "New(..)", который принимал пару параметров (потому что именно так я хотел использовать его в своем коде). Но тем самым я подавил стандартный (скрытый) конструктор New() без параметров, который VB добавляет за кулисами. По-видимому, обработчик веб-службы требует наличия конструктора без параметров. Как только я снова добавил в свой класс конструктор New() без параметров, все заработало нормально.

Ответ 6 · Gerrie Schenck

Я получил то же сообщение, но мое было вызвано отсутствием System.Runtime.Serialization.dll, так как я пытался запустить приложение 3.5 на машине с установленной только .NET 2.0.

Ответ 7 · Has AlTaiar

У меня была та же проблема, но я обнаружил, что один из параметров WebMethod имеет член типа interface, поэтому VS не может его сериализовать. вот исключение при попытке скачать файл disco

System.InvalidOperationException: не удается сериализовать член Leopard.JobDespatchParameters.SendingUser типа Leopard.Interfaces.IUser. Дополнительные сведения см. во внутреннем исключении. ---> System.NotSupportedException: невозможно сериализовать член Leopard.JobDespatchParameters.SendingUser типа Leopard.Interfaces.IUser, поскольку это интерфейс.

Ответ 8 · Qazi

Старый поток, но у меня была другая проблема, может быть, кому-то поможет. DLL, на которые ссылаются, были перепутаны между двумя версиями на уровне данных и сервисном уровне, что вызвало проблему.

Ответ 9 · justAlex

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы