<WebMethod()> _
Public Function hello(ByVal s As Object) As Object
Return CType(s, test_class.some).test
End Function
и есть клиентское приложение со следующим методом:
Private Sub Button1_Click(...) Handles Button1.Click
Dim ws As New localhost.Service1
Dim s As New test_class.some
s.test = "boom"
TextBox1.Text = ws.hello(s)
End Sub
Получаю ошибку: "There was an error generating the XML document. ---> System.InvalidOperationException: The type test_class.some was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."
Вопросы стандартные: кто виноват и что делать.
Прописывание XmlInclude(GetType(test_class.some)) веб-методу ничего не дает, с SoapInclude — аналогично.
Прописывание Serializable и XmlType в объявлении класса — тоже.
Тот факт, что веб-метод принимает параметр типа Object — важен. Проблема возникла во вполне реальной задаче, приведенный выше код — он лишь для более понятной иллюстрации.
Что я упустил?
Заранее спасибо.
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Здравствуйте, Vovo4K, Вы писали:
VK>Вопросы стандартные: кто виноват и что делать. VK>Прописывание XmlInclude(GetType(test_class.some)) веб-методу ничего не дает, с SoapInclude — аналогично. VK>Прописывание Serializable и XmlType в объявлении класса — тоже.
А ты уверег, что передаешь сгенерированный студией класс test_class, а не класс, который в твоей отдельной сборе объявлен?
VK>Тот факт, что веб-метод принимает параметр типа Object — важен. Проблема возникла во вполне реальной задаче, приведенный выше код — он лишь для более понятной иллюстрации.
Ты слишком оптимистичен в возможностях Xml сериализации.
Re[2]: передача пользовательского объекта вебсервису
Здравствуйте, Vovo4K, Вы писали:
VK>Какая там может быть двусмысленность?
Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.
Re: передача пользовательского объекта вебсервису
От:
Аноним
Дата:
01.09.04 14:20
Оценка:
Здравствуйте, Vovo4K, Вы писали:
VK>Тот факт, что веб-метод принимает параметр типа Object — важен. Проблема возникла во вполне реальной задаче, приведенный выше код — он лишь для более понятной иллюстрации.
XmlIncludeAttribute?
Re[6]: передача пользовательского объекта вебсервису
Здравствуйте, mikа, Вы писали:
M>Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.
Поиск (что здесь, что в гугле) дает ответ — использовать XmlInclude.
Попытки "вслепую" применить XmlInclude к методу веб-сервиса результата не дали, об этом написано еще в первом посте.
Таким образом, вопрос трансформируется в следующий: как ПРАВИЛЬНО применить XmlInclude в описанной ситуации? Что и где должно быть прописано? Внятного работающего примера поиск мне не дал. Если кто-либо поможет указаниями, что именно нужно сделать — буду очень благодарен.
Ответы в стиле "у тебя ничего не работает, потому что ты не разбираешься в сериализации", безусловно, читать очень увлекательно. Но хотелось бы конкретный пример или ссылку.
Спасибо.
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[7]: передача пользовательского объекта вебсервису
Здравствуйте, Vovo4K, Вы писали:
VK>Поиск (что здесь, что в гугле) дает ответ — использовать XmlInclude. VK>Попытки "вслепую" применить XmlInclude к методу веб-сервиса результата не дали, об этом написано еще в первом посте.
Я уже сказал, что проблема не в XmlInclude. У тебя два типа, одинаковые по-названию. Нужно из одного сконвертировать в другой. Или в клиентской части отказать от использования библиотеке, где описан твой тип, и оперировать только теми типами, которые у тебя есть в пространстве имен localhost
Re[8]: передача пользовательского объекта вебсервису
Здравствуйте, mikа, Вы писали:
M>Я уже сказал, что проблема не в XmlInclude. У тебя два типа, одинаковые по-названию. Нужно из одного сконвертировать в другой. Или в клиентской части отказать от использования библиотеке, где описан твой тип, и оперировать только теми типами, которые у тебя есть в пространстве имен localhost
Так тип test_class.some как раз-таки в localhost и не попадает, т.к. у веб-метода и параметр, и возвращаемое значение — типа Object.
Прописывать вместо Object собственно имя типа (в этом случае всё замечательно работает) нельзя — такова специфика задачи.
Когда я пытаюсь объявить свой тип с помощью XmlInclude — ничего не меняется, при обновлении веб-ссылки соответствующее объявление класса в её код не включается.
Соответственно, использовать в клиентском приложении тип localhost.test_class.some я не могу — его там просто нет.
Где тут могут быть грабли?
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[9]: передача пользовательского объекта вебсервису
Здравствуйте, Vovo4K, Вы писали:
VK>Здравствуйте, mikа, Вы писали:
M>>Я уже сказал, что проблема не в XmlInclude. У тебя два типа, одинаковые по-названию. Нужно из одного сконвертировать в другой. Или в клиентской части отказать от использования библиотеке, где описан твой тип, и оперировать только теми типами, которые у тебя есть в пространстве имен localhost
VK>Так тип test_class.some как раз-таки в localhost и не попадает, т.к. у веб-метода и параметр, и возвращаемое значение — типа Object. VK>Прописывать вместо Object собственно имя типа (в этом случае всё замечательно работает) нельзя — такова специфика задачи.
Не нужно менять тип параметра, нужно лишь на клиенте передавать параметром нужный тип, localhost.some
Private Sub Button1_Click(...) Handles Button1.Click
Dim ws As New localhost.Service1
Dim s As Newlocalhost.some
s.test = "boom"
TextBox1.Text = ws.hello(s)
End Sub
Re[6]: передача пользовательского объекта вебсервису
Здравствуйте, mikа, Вы писали: VK>>Какая там может быть двусмысленность? M>Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.
Не соглашусь.
Если класс пометить
При этом MyTestClass — это тип, принимаемый методом, то все будет работать и без классов, сгенерированных по WSDL.
На счет передачи параметра методу как object не уверен. надо пробовать.
D>При этом MyTestClass — это тип, принимаемый методом, то все будет работать и без классов, сгенерированных по WSDL. D>На счет передачи параметра методу как object не уверен. надо пробовать.
Заработало!!!
Единственный недочёт — при генерации веб-ссылки автоматически прописывается атрибут XmlIncude(GetType(some)).
Его приходится вручную заменять на "test_class.some".
Но это я уже как-нибудь заборю.
Спасибо огроменное!
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!