1

クラス 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 を取得するまでには至りません。コンソールに次の出力が生成されます。

セッション セッション

4

2 に答える 2

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));
                    }
                }
            }
        } 
于 2011-03-14T20:24:02.870 に答える
0

これは、 WebServiceInfoで行ったことと非常によく似ています 。情報を含むカスタムオブジェクトを返します。(私があなたの質問とブログを十分に理解している場合)

于 2011-03-22T22:52:45.337 に答える