我正在使用類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的複雜內容。產生在控制檯下面的輸出:
會話的會話
肖恩,似乎是有趣的代碼。如果你不介意的話,可以分享整個代碼。我試圖執行相同的操作,但遇到很多困難。在上面的代碼中,不知道什麼是參數,描述和ComplexParameter。請幫忙! – 2011-03-25 12:46:51