【问题标题】:Detailed ServiceDescription / Proxy from WSDL来自 WSDL 的详细服务描述/代理
【发布时间】:2011-03-10 18:30:12
【问题描述】:

我正在使用 ServiceDescription / ServiceDescriptionImporter 类来动态调用 Web 服务。我想深入挖掘一下 WSDL 描述并获得

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;

我已经能够找到一些基本信息,例如方法名称,参数信息,但我需要更深入的分析。例如,我需要访问 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 的 complexContent。在控制台中产生以下输出:

会话会话

【问题讨论】:

    标签: c# web-services wsdl proxy-classes dynamic-proxy


    【解决方案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));
                        }
                    }
                }
            } 
    

    【讨论】:

    • Sean,看起来很有趣的代码。如果您不介意,是否可以共享整个代码。我试图实现相同但遇到很多困难。在上面的代码中,不确定参数、描述和复杂参数是什么。请帮忙!
    【解决方案2】:

    这看起来与您所做的非常相似 WebServiceInfo 它返回带有信息的自定义对象。 (如果我足够了解您的问题和博客)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多