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