передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 01.09.04 13:21
Оценка:
ламерский (наверно) вопрос.

допустим, есть класс

Public Class some
    Public test As String
End Class


есть вебсервис со следующим методом:

<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 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re: передача пользовательского объекта вебсервису
От: mikа Stock#
Дата: 01.09.04 13:44
Оценка:
Здравствуйте, Vovo4K, Вы писали:

VK>Вопросы стандартные: кто виноват и что делать.

VK>Прописывание XmlInclude(GetType(test_class.some)) веб-методу ничего не дает, с SoapInclude — аналогично.
VK>Прописывание Serializable и XmlType в объявлении класса — тоже.

А ты уверег, что передаешь сгенерированный студией класс test_class, а не класс, который в твоей отдельной сборе объявлен?

VK>Тот факт, что веб-метод принимает параметр типа Object — важен. Проблема возникла во вполне реальной задаче, приведенный выше код — он лишь для более понятной иллюстрации.


Ты слишком оптимистичен в возможностях Xml сериализации.
Re[2]: передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 01.09.04 13:53
Оценка:
Здравствуйте, mikа, Вы писали:

M>Ты слишком оптимистичен в возможностях Xml сериализации.


Это я уже понял.
Тем не менее вопрос прежний: что делать в описанной ситуации?
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[3]: передача пользовательского объекта вебсервису
От: mikа Stock#
Дата: 01.09.04 13:56
Оценка: 10 (1)
Здравствуйте, Vovo4K, Вы писали:

VK>Это я уже понял.

VK>Тем не менее вопрос прежний: что делать в описанной ситуации?

У меня тоже прежний вопрос
Re[4]: передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 01.09.04 14:04
Оценка:
Здравствуйте, mikа, Вы писали:

M>У меня тоже прежний вопрос


АЙ!
Я его не совсем понял, поэтому пропустил.

Класс объявлен в отдельной class library.
Веб-сервис и win-приложение его референсят.
Какая там может быть двусмысленность?
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[5]: передача пользовательского объекта вебсервису
От: mikа Stock#
Дата: 01.09.04 14:07
Оценка:
Здравствуйте, Vovo4K, Вы писали:

VK>Какая там может быть двусмысленность?


Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.
Re: передача пользовательского объекта вебсервису
От: Аноним  
Дата: 01.09.04 14:20
Оценка:
Здравствуйте, Vovo4K, Вы писали:

VK>Тот факт, что веб-метод принимает параметр типа Object — важен. Проблема возникла во вполне реальной задаче, приведенный выше код — он лишь для более понятной иллюстрации.


XmlIncludeAttribute?
Re[6]: передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 02.09.04 06:31
Оценка:
Здравствуйте, mikа, Вы писали:

M>Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.


Поиск (что здесь, что в гугле) дает ответ — использовать XmlInclude.
Попытки "вслепую" применить XmlInclude к методу веб-сервиса результата не дали, об этом написано еще в первом посте.

Таким образом, вопрос трансформируется в следующий: как ПРАВИЛЬНО применить XmlInclude в описанной ситуации? Что и где должно быть прописано? Внятного работающего примера поиск мне не дал. Если кто-либо поможет указаниями, что именно нужно сделать — буду очень благодарен.

Ответы в стиле "у тебя ничего не работает, потому что ты не разбираешься в сериализации", безусловно, читать очень увлекательно. Но хотелось бы конкретный пример или ссылку.

Спасибо.
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[7]: передача пользовательского объекта вебсервису
От: mikа Stock#
Дата: 02.09.04 06:59
Оценка:
Здравствуйте, Vovo4K, Вы писали:

VK>Поиск (что здесь, что в гугле) дает ответ — использовать XmlInclude.

VK>Попытки "вслепую" применить XmlInclude к методу веб-сервиса результата не дали, об этом написано еще в первом посте.

Я уже сказал, что проблема не в XmlInclude. У тебя два типа, одинаковые по-названию. Нужно из одного сконвертировать в другой. Или в клиентской части отказать от использования библиотеке, где описан твой тип, и оперировать только теми типами, которые у тебя есть в пространстве имен localhost
Re[8]: передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 02.09.04 07:29
Оценка:
Здравствуйте, mikа, Вы писали:

M>Я уже сказал, что проблема не в XmlInclude. У тебя два типа, одинаковые по-названию. Нужно из одного сконвертировать в другой. Или в клиентской части отказать от использования библиотеке, где описан твой тип, и оперировать только теми типами, которые у тебя есть в пространстве имен localhost


Так тип test_class.some как раз-таки в localhost и не попадает, т.к. у веб-метода и параметр, и возвращаемое значение — типа Object.
Прописывать вместо Object собственно имя типа (в этом случае всё замечательно работает) нельзя — такова специфика задачи.
Когда я пытаюсь объявить свой тип с помощью XmlInclude — ничего не меняется, при обновлении веб-ссылки соответствующее объявление класса в её код не включается.
Соответственно, использовать в клиентском приложении тип localhost.test_class.some я не могу — его там просто нет.
Где тут могут быть грабли?
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Re[9]: передача пользовательского объекта вебсервису
От: mikа Stock#
Дата: 02.09.04 07:49
Оценка:
Здравствуйте, 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 New localhost.some
    s.test = "boom"
    TextBox1.Text = ws.hello(s)
End Sub
Re[6]: передача пользовательского объекта вебсервису
От: Dronkoff Россия  
Дата: 02.09.04 07:59
Оценка:
Здравствуйте, mikа, Вы писали:
VK>>Какая там может быть двусмысленность?
M>Такая, что инфраструктура веб сервис принимает только те классы, которые она сгенерировала по WSDL. Проблема неоднократно обсуждалась, так что воспользуйся поиском.
Не соглашусь.
Если класс пометить
[System.Xml.Serialization.SoapTypeAttribute("MyTestClass", "http://MyTestWebSvc")]

при этом в web сервисе
[WebService(Namespace="http://MyTestWebSvc")]

При этом MyTestClass — это тип, принимаемый методом, то все будет работать и без классов, сгенерированных по WSDL.
На счет передачи параметра методу как object не уверен. надо пробовать.
Re: передача пользовательского объекта вебсервису
От: Andre Украина  
Дата: 02.09.04 08:31
Оценка:
VK>допустим, есть класс

VK>
VK>Public Class some
VK>    Public test As String
VK>End Class
VK>


Это просто пример или в классе данных действительно используются просто паблик поля?
Попробуй обернуть их в свойства
... << RSDN@Home 1.1.4 beta 2 >>
Я бы изменил мир — но Бог не даёт исходников...
Re[7]: передача пользовательского объекта вебсервису
От: Vovo4K Россия  
Дата: 02.09.04 09:19
Оценка:
Здравствуйте, Dronkoff, Вы писали:

D>Если класс пометить

D>
D>[System.Xml.Serialization.SoapTypeAttribute("MyTestClass", "http://MyTestWebSvc")]
D>

D>при этом в web сервисе
D>
D>[WebService(Namespace="http://MyTestWebSvc")]
D>

D>При этом MyTestClass — это тип, принимаемый методом, то все будет работать и без классов, сгенерированных по WSDL.
D>На счет передачи параметра методу как object не уверен. надо пробовать.

Заработало!!!
Единственный недочёт — при генерации веб-ссылки автоматически прописывается атрибут XmlIncude(GetType(some)).
Его приходится вручную заменять на "test_class.some".
Но это я уже как-нибудь заборю.

Спасибо огроменное!
... << RSDN@Home 1.1.4 beta 2 >>
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.