Я использую классы 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);
}
}
}
Это продвинуло меня немного дальше, но не настолько, чтобы получить комплексное содержимое типа ComplexType. Производит следующий вывод в консоли:
Сессия Сессия