2011-03-10 66 views
1

我正在使用類ServiceDescription/ServiceDescriptionImporter動態調用Web服務。我想挖成深一點的WSDL描述,並獲得來自WSDL的詳細ServiceDescription /代理

1)參數信息爲每個Web方法

2)實際類型/組合物的所有Web方法的每個參數(即,如果一個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; 

我已經能夠找到一些b asic的信息,如方法名稱,參數信息,但我需要更深入的分析。例如,我需要訪問基本上所有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的複雜內容。產生在控制檯下面的輸出:

會話的會話

回答

1

如果任何人有類似的問題,這是我如何做的:

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)); 
        } 
       } 
      } 
     } 
+0

肖恩,似乎是有趣的代碼。如果你不介意的話,可以分享整個代碼。我試圖執行相同的操作,但遇到很多困難。在上面的代碼中,不知道什麼是參數,描述和ComplexParameter。請幫忙! – 2011-03-25 12:46:51

0

這看起來很相似,你,你做了什麼WebServiceInfo它用信息返回自定義對象。 (如果我理解你的問題和博客不夠好)