Подробное описание услуги/прокси из WSDL

Я использую классы 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. Производит следующий вывод в консоли:

Сессия Сессия


person Sean Thoman    schedule 10.03.2011    source источник


Ответы (2)


Если у кого-то есть подобный вопрос, вот как я это сделал:

foreach (System.Xml.Schema.XmlSchemaComplexType item in xmlSchema.SchemaTypes.Values)
        {
            ComplexType cType = new ComplexType(item.Name);

            System.Xml.Schema.XmlSchemaContentModel model = item.ContentModel;
            System.Xml.Schema.XmlSchemaComplexContent complex = model as System.Xml.Schema.XmlSchemaComplexContent;

            if (complex != null)
            {
                System.Xml.Schema.XmlSchemaComplexContentExtension extension = complex.Content as System.Xml.Schema.XmlSchemaComplexContentExtension;
                System.Xml.Schema.XmlSchemaParticle particle = extension.Particle;
                System.Xml.Schema.XmlSchemaSequence sequence = particle as System.Xml.Schema.XmlSchemaSequence;

                if (sequence != null)
                {
                    List<SimpleType> primitives = new List<SimpleType>(); 

                    foreach (System.Xml.Schema.XmlSchemaElement childElement in sequence.Items)
                    {
                        string name = childElement.Name;
                        string type = childElement.SchemaTypeName.Name;
                        cType.Primitives.Add(new SimpleType(name, type));
                    }

                    if (cType.Name == parameter.Type || "ArrayOf" + cType.Name == parameter.Type)
                    {
                        descriptions.Add(new ComplexParameter(cType, item.Name));
                    }
                }
            }
        } 
person Sean Thoman    schedule 14.03.2011
comment
Шон, кажется, интересный код. Спасибо, если вы можете поделиться всем кодом, если вы не возражаете. Я пытался реализовать то же самое, но получил много трудностей. В приведенном выше коде не уверен, что такое параметр, описание и комплексный параметр. Пожалуйста помоги! - person Sri Reddy; 25.03.2011

Это очень похоже на то, что вы сделали WebServiceInfo. объекты с информацией. (если я достаточно хорошо понимаю ваш вопрос и блог)

person Thymine    schedule 22.03.2011