powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WebService: что такое strong typed?
19 сообщений из 19, страница 1 из 1
WebService: что такое strong typed?
    #35219184
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
клиент хочет именно такого, а я хотел передавать параметр внутрь ХМЛ, который мог бы содержать
внутри разные параметры...

как понять -strong typed? т.е. чего он хочет?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219221
gp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше всего, спросите у него, чего именно он хочет.

strong typed это концепция, а не конкретная технология.
Код: plaintext
1.
2.
3.
4.
ToyBear strongTypedWinnieThePooh = new ToyBear().AddHoney(new Honey());
strongTypedWinnieThePooh.Sing(new Sopelki("вот горшок пустой, он предмет простой"));
Toy toy = strongTypedWinnieThePooh;
toy.Play();
пока все strongly typed видите, как весело!
Код: plaintext
1.
string looselyTypedXmlBear = baseWinnie.ToXml().ToString();

а теперь стало грустно
Код: plaintext
1.
2.
ToyBear deserializedToyBear = Serializer.Deserialize(looselyTypedXmlBear) as ToyBear;
if( deserializedToyBear == null ) throw new ArgumentException("это не винни!");
else deserializedToyBear.Sing();

а теперь опять весело!
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219692
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да он ничгео не скажет

т.е. попросту говоря - stongly typed method для Webservice - это значит не использовать в качестве параметров хмл, в котором может быть всё, что угодно, а только явные параметры с указанными типами...
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219789
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhклиент хочет именно такого, а я хотел передавать параметр внутрь ХМЛ, который мог бы содержать
внутри разные параметры...

А зачем так делать? Разве не удобнее "явные параметры с указанными типами" передавать?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219848
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_BBB Winnipuhклиент хочет именно такого, а я хотел передавать параметр внутрь ХМЛ, который мог бы содержать
внутри разные параметры...

А зачем так делать? Разве не удобнее "явные параметры с указанными типами" передавать?

лучше, но мне надо передавать описание дерева, т.е. грубо говоря пример:
метод создающий поддерево в дереве, я пердаю в хмл описание поддерева, структуру.

И как мне сделать это используя strongly typed метод?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219935
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh...
И как мне сделать это используя strongly typed метод?
Передавать экземпляр поддерева (ес-с-нно, он должен быть сериализуемым, иначе через SOAP не "пропихнентся").
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35219998
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu Winnipuh...
И как мне сделать это используя strongly typed метод?
Передавать экземпляр поддерева (ес-с-нно, он должен быть сериализуемым, иначе через SOAP не "пропихнентся").

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

Как передавать сериализуемый экземпляр подерева? если можно чуть подробнее...
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35220590
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh...
Как передавать сериализуемый экземпляр подерева? если можно чуть подробнее...
Куда уж - "чуть подробнее" (так сгодится):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public class Script
{
	public static void Main (string[] args)
	{
	   try
	   {
	   	MyTreeNode node = new MyTreeNode("Root")
				.With(new MyTreeNode("First Child level 1")
					.With(new MyTreeNode("First Child level 2")
						.With(new MyTreeNode())
						.With(new MyTreeNode())
						.With(new MyTreeNode())
					)
					.With(new MyTreeNode("Second Child level 2"))
					.With(new MyTreeNode("Third Child level 2"))
				)
				.With(new MyTreeNode("Second Child level 1"))
				.With(new MyTreeNode("Third Child level 1"))
				;
	   	string xml = MyWebMethodWithStrongTypedArgument (node);
	   	Console.WriteLine(xml);
	   	MyTreeNode node1 = MyWebMethodWithLooselyTypedArgument (xml);
	   	foreach (MyTreeNode mtn in node1.Children) {
		   	Console.WriteLine(mtn.Caption);
	   	}
	   }
	   catch (Exception ex)
	   {
	      Console.WriteLine(ex.ToString());
	   }
	}

	//[WebMethod] in future
	public static string MyWebMethodWithStrongTypedArgument (MyTreeNode node)	{
		return node.Serialize ();
	}
	//[WebMethod] in future
	public static MyTreeNode MyWebMethodWithLooselyTypedArgument (string xml)	{
		return MyTreeNode.Deserialize (xml);
	}
}

[Serializable]
public class MyTreeNode {
	string		_caption;
	List<MyTreeNode>	_children;
	
	[XmlAttribute]
	public string	Caption { get { return _caption; } set { _caption = value; } }
	
	[XmlArrayItem(ElementName= "MyTreeNode", IsNullable=true,   Type = typeof(MyTreeNode))]
	[XmlArray(ElementName="MyTreeNodes")]
	public List<MyTreeNode> Children { get { return _children; } }
	
	public MyTreeNode () {
		_children = new List<MyTreeNode> ();
	}

	public MyTreeNode (string caption): this() {
		_caption = caption;
	}
	
	public MyTreeNode With (MyTreeNode node) {
		if (string.IsNullOrEmpty(node.Caption))
			node.Caption = string.Format("MyTreeNode{0}", _children.Count + 1);
		_children.Add(node);
		return this;
	}
	
	public string Serialize () {
		string ret;
		XmlSerializer xmlFormat = new XmlSerializer(typeof(MyTreeNode));
		Stream ms = new MemoryStream();
		using (StreamReader sr = new StreamReader(ms)) {
			xmlFormat.Serialize(ms, this);
			ms.Position = 0;
			ret = sr.ReadToEnd();
		}
		return ret;
	}
	
	public static MyTreeNode Deserialize (string str) {
		MyTreeNode ret;
			XmlSerializer mySerializer = new XmlSerializer(typeof(MyTreeNode));
			Stream ms = new MemoryStream();
	      using (StreamWriter sw = new StreamWriter(ms)) {
				sw.Write(str);
				sw.Flush();
				ms.Position = 0;
				ret = (MyTreeNode) mySerializer.Deserialize(ms);
			}
		return ret;
	}
}
??
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35220617
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подробнее уже некуда

т.е. резюме:

если я создам сериализуемый класс для передачи параметров, даже если они могут содержать каждый раз разное количество данных внутри - то вот это и будет strong typed метод?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35220856
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh...
если я создам сериализуемый класс для передачи параметров, даже если они могут содержать каждый раз разное количество данных внутри - то вот это и будет strong typed метод?
Не совсем так, "strong typed" заключается не в том, что передается экземпляр какого-либо типа, а в том, что этот тип - наиболее "специализирован" под задачи, решаемые методом, принимающем параметр данного типа.
Например, можно написать метод, принимающий экземпляр IDataParameter или IDbDataParameter и "скармливать" этому методу экземпляры SqlParameter(), OleDbParameter(), OracleParameter() и т.д.
С точки зрения "type safety" метод будет вполне себе "strong typed", т.к. никакой string/int/Enum и пр. Point туда уже не "пролезет"...
Однако ж, если в самом методе используется определенный провайдер БД (например, OracleCommand()), то при передаче внутрь SqlParameter(), OleDbParameter() - получится исключение на предмет несоответствия типов, т.е. получается, что с точки зрения функциональности метода - аргумент нифига не "strong typed", т.к. его "strong" составляющая "смягчена" использованием интерфейса IDataParameter.
То же самое и с вашей "коллекцией значений", если вы будете "ожидать" в методе экземпляр ArrayList(), то в общем случае метод не примет string[] или int[] (с этой точки зрения - ArrayList "strong typed"), однако ж - внутри метода вам придется разбираться с каждым элементом этого ArrayList-а на предмет "а что же оно такое?" и делать кастинг для использования свойств/методов тех экземпляров, которые "закрыты" в ArrayList-е...
Мой (ваш?) пример с "деревом", может быть, и не совсем удачен (что просили, то и написал), т.к. он подразумевает "неопределенность" структуры относительно количества вложенных узлов, однако ж, с точки зрения "strong typed" использования этого "дерева" - все нормально, т.к. ничего другого, кроме как "показывать заголовок" и "держать список дочерних узлов" оно не умеет и ничего другого вместо именно этого "дерева" вы методу подсунуть не сможете.
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35225759
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо! доходчиво....

Но вот еще вопрос:

есил вызывающее клиентское приложение будет скажем на Java, кто и где отбиваться будет от некорректного параметра? Сам вебсервис во время вызова и передачи параметра?

Но как клиенту удостовериться перед вызовом, что он передает подходящий тип? ведь скажем класс мог быть изменен?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226352
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начнем, как водится, "с конца":
Winnipuh...
Но как клиенту удостовериться перед вызовом, что он передает подходящий тип? ведь скажем класс мог быть изменен?
Клиент получает от веб-сервиса т.н. "контракт" в виде WSDL-файла, в котором мета-описаниями (на XML) указано (в частности) - какие методы и с какими параметрами можно вызывать у веб-сервиса, если типы параметров "объектные", то в "контракте" прилагается также "схема" для сериализации/десериализации каждого такого типа. Отсюда вывод - если клиент в состоянии "восстановить" тип по такой "схеме", то он сможет и создать экземпляр нужного типа для вызова нужного метода. Если за время существования клиента кто-то изменил "контракт" (в частности - переделал класс для типа параметра), то на вызов метода со "старым" типом ругнется сам лично веб-сервис... Клиента в этом случае придется перекомпилять с новым вариантом "контракта".
Winnipuh...
есил вызывающее клиентское приложение будет скажем на Java, кто и где отбиваться будет от некорректного параметра? Сам вебсервис во время вызова и передачи параметра?...

В принципе, выше я уже ответил на поставленный вопрос, однако ж, стоило бы еще раз напомнить, что само понятие "веб-сервис" это не что-то "волшебное", связывающее, скажем, Java/.NET/etc, а просто - набор "спецификаций" и "соглашений" (SOAP), реализованный поверх стандатрного протокола передачи текстовой информации (HTTP). Т.е. сам факт "кросс-платформенных интеграционных возможностей" веб-сервисов базируется на простом допущении о том, что любая "платформа" в состоянии принять/переслать текстовую строку, с которой она "потом" может сделать все, что ей заблагорассудится (например, сделать из нее экземпляр какого-то класса с помощью "соглашений сериализации" SOAP, или наоборот).
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226483
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 qu-qu

спасибо за ответ!
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226500
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот смотрите, я вставил ваш класс для примера,
в метод

Код: plaintext
public string MST(MyTreeNode node)

получил WSDL, это и есть полное описание сехмы преобразования?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
- <s:complexType name="MyTreeNode">
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="MyTreeNodes" type="tns:ArrayOfMyTreeNode" /> 
  </s:sequence>
  <s:attribute name="Caption" type="s:string" /> 
  </s:complexType>
- <s:complexType name="ArrayOfMyTreeNode">
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="unbounded" name="MyTreeNode" nillable="true" type="tns:MyTreeNode" /> 
  </s:sequence>
  </s:complexType>
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226626
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh...
получил WSDL, это и есть полное описание сехмы преобразования?
...
Совершенно верно, это оно и есть...
С поправочкой на то, что на стороне клиента по такому описанию вы не сможете получить "полный аналог" исходного класса MyTreeNode (в частности потому, что я "намеренно" изменил имя узла для коллекции/массива дочерних узлов), но это в общем-то и не нужно, главное, чтобы клиент смог сгенерить "что-то похожее", которое потом сериализуется при вызове веб-метода в структуру XML полностью соответствующую приведенной схеме, и "потом" на стороне веб-сервиса "оно" легко сможет быть десериализовано уже в "настоящий" экземпляр исходного MyTreeNode().
З.Ы. на стороне клиента класс-"заглушка" для параметра типа MyTreeNode может быть сгенерен из WSDL таким образом:
Код: plaintext
1.
2.
3.
4.
5.
...
public class MyTreeNode {
	public MyTreeNode[] MyTreeNodes;
	public string Caption;
}
...
, но веб-сервис это "не колышет", т.к. фактически он принимает "на вход" только XML по приведенной выше схеме и "внутри себя" генерит "правильный" экземпляр типа MyTreeNode для передачи на выполнение веб-метода...
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226898
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проясняется....

что значит "tns:" ?
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35226934
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhпроясняется....

что значит "tns:" ?
Сокращение от "target namespace" - часть спецификации SOAP/WSDL, которая "требует" обязательного указания "пространств имен" для всех типов, описанных в "контракте"... (чтоб, не дай БГ, не "попутать" их другими типами, которые задаются с помощью XML так же просто, как пересылаются пресловутые "2 байта").
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35227189
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu Winnipuhпроясняется....

что значит "tns:" ?
Сокращение от "target namespace" - часть спецификации SOAP/WSDL, которая "требует" обязательного указания "пространств имен" для всех типов, описанных в "контракте"... (чтоб, не дай БГ, не "попутать" их другими типами, которые задаются с помощью XML так же просто, как пересылаются пресловутые "2 байта").

аааа! точно!


я почитал про WCF, может стоит сразу на нем делать сервис? вроде как последний писк в вебсервисах ...
...
Рейтинг: 0 / 0
WebService: что такое strong typed?
    #35227486
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh...
я почитал про WCF, может стоит сразу на нем делать сервис? вроде как последний писк в вебсервисах ...
Не знаю, еще не пробовал в рабочих проектах (тут бы с "классическими" веб-сервисами успеть "расплеваться").
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WebService: что такое strong typed?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]