Я использую классы ServiceDescription / ServiceDescriptionImporter для динамического вызова веб-сервисов.Я хотел бы углубиться в описание WSDL и получить
1) Информация о параметрах для каждого из веб-методов
2) Фактические типы / состав каждого параметра всех веб-сайтов.методы (т. е. если WebMethod принимает какой-либо сложный тип в качестве параметра, мне нужно знать примитивы / другие типы, из которых он также состоит, если это возможно)
Вот код, который у меня есть для динамического вызова:
public static object CallWebService(string webServiceAsmx, string serviceName, string methodName, object[] args = null)
{
WebClient client = new WebClient();
Stream stream = client.OpenRead(webServiceAsmx + "?wsdl");
ServiceDescription description = ServiceDescription.Read(stream);
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap12";
importer.AddServiceDescription(description, null, null);
importer.Style = ServiceDescriptionImportStyle.Client;
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;
Мне удалось найти некоторую базовую информацию, такую как имена методов, информация о параметрах, но мне нужен более глубокий анализ.Например, мне нужен доступ по существу ко всей информации, которую Wsdl.exe производит в прокси-классах, но я не хочу запускать Wsdl.exe, просто найдите информацию динамически.Для каждого метода мне нужно знать, из чего состоит его тип возвращаемого значения, из чего состоят его параметры и т. Д. Я знаю его в WSDL, но не знаю, как его программно извлечь.Вот некоторые из классов, которые я изучал:
ServiceDescription.Description
ServiceDescription.Messages
ServiceDescription.Types
Кажется, что многие из них оказываются пустыми?
Заранее спасибо.
РЕДАКТИРОВАТЬ
Я получил немного дальше, это XML-схема (WSDL), которую я пытаюсь пройти:
- <s:complexType name="Session">
- <s:complexContent mixed="false">
- <s:extension base="tns:EntityObject">
- <s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Host" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="SessionType" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="LoginTime" type="s:dateTime" />
<s:element minOccurs="1" maxOccurs="1" name="LogoutTime" type="s:dateTime" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
И этокод для обхода:
foreach (System.Xml.Schema.XmlSchemaComplexType item in xmlSchema.SchemaTypes.Values)
{
if (item != null)
{
System.Xml.Schema.XmlSchemaParticle particle = item.Particle;
System.Xml.Schema.XmlSchemaSequence sequence = particle as System.Xml.Schema.XmlSchemaSequence;
if (sequence != null)
{
foreach (System.Xml.Schema.XmlSchemaElement childElement in sequence.Items)
{
string name = childElement.Name;
string type = childElement.SchemaTypeName.Name;
Console.WriteLine(name + " " + type);
}
}
}
Это немного продвинуло меня, но не так далеко, как получение complexContent of ComplexType.Создает в консоли следующий вывод:
Session Session