Мы воспользовались сторонней веб-службой и пытаемся вызвать ее из веб-приложения ASP.NET. Однако, когда я создаю экземпляр веб-службы, возникает следующее исключение System.InvalidOperationException:
Метод "ABC.XYZ" не может быть отражен. System.InvalidOperationException: метод "ABC.XYZ" не может быть отражен. ---> System.InvalidOperationException: элемент XML "MyDoc" из пространства имен "http://mysoftware.com/ns' ссылается на метод и тип. Измените имя сообщения метода с помощью WebMethodAttribute или измените корневой элемент типа с помощью XmlRootAttribute.
Из того, что я могу понять, существует некоторая двусмысленность между методом и типом в веб-службе. Может ли кто-нибудь прояснить возможную причину этого исключения, и есть ли что-нибудь, что я могу сделать, чтобы исправить это, или я должен просто обратиться к владельцам веб-сервисов, чтобы исправить это?
Изменить: Visual Studio 2008 создал прокси-класс. К сожалению, я не могу предоставить ссылку на wsdl, так как это веб-служба для локально установленного стороннего приложения.
Я столкнулся с той же проблемой ранее сегодня. Причина была в том, что класс, сгенерированный 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
Другой сценарий, в котором может произойти эта ошибка: у меня просто был другой веб-метод с тем же именем (но другими параметрами) в моем веб-сервисе, который проскользнул во время слияния кода. После того, как я удалил старый метод, он сработал.