使用反射从Soap Client获取Web服务方法

时间:2011-01-17 16:31:11

标签: c# wcf web-services reflection

我正在尝试从SOAPClient对象获取一个MethodInfo集合,该对象仅包含webservice本身的方法。这是我目前正在做的事情。目前它返回MyServiceSoapClient的所有方法。

MyServiceSoapClient myService = new MyServiceSoapClient();
MethodInfo[] methods = myService.GetType().GetMethods();            

2 个答案:

答案 0 :(得分:2)

GetMethods()方法支持可用于更具体地选择要返回的方法的绑定标志。看看这里:

http://msdn.microsoft.com/en-us/library/4d848zkb.aspx

此外,您可以使用一些linq进一步指定您的目标:

MethodInfo[] methods = myService.GetType().GetMethods();
MethodInfo[] methodsOfWebservice = methods.Where(m => m.whatever == whatever && m.anothercondition == true); // etc.

您拥有的最后一个选项是为要返回的每个方法添加一个属性,然后测试是否存在属性。看看这里:

http://www.codeproject.com/KB/cs/attributes.aspx

更新2011-01-18

我查看了Microsoft KnowledgeBase,发现[WebMethod]是一个属性。 http://support.microsoft.com/kb/308359http://msdn.microsoft.com/en-us/library/28a537td.aspx。 获取所有方法时,您可以测试是否存在此属性,以确定该方法是否为WebMethod。

List<MethodInfo> methodsOfWebservice = new List<MethodInfo>();
MethodInfo[] methods = myService.GetType().GetMethods();
foreach(MethodInfo method in methods)
{
  foreach (Attribute attribute in method.GetCustomAttributes(true))
  {
    if (attribute is WebMethodAttribute)
      methodsOfWebservice.Add(method);
  }
}

更新2011-01-20

我刚刚测试了以下代码,实际上它确实给了我WebMethodAttribute变量中的attribute

Type type = obj.GetType();
var method = type.GetMethod("methodname");
var attribute = method.GetCustomAttributes(typeof(WebMethodAttribute), true);

我确信你应该能够对你的代码做同样的事情并测试WebMethodAttribute的存在

答案 1 :(得分:0)

这是我使用XML解析的方法:

首先,我从WSDL下载XML:

private string GetPageSource(string url)
    {
        string htmlSource = string.Empty;
        try
        {
            WebProxy myProxy = new WebProxy("ProxyAdress", 8080);
            using (WebClient client = new WebClient())
            {
                client.Proxy = myProxy;
                client.Proxy.Credentials = new NetworkCredential("Username", "Password");
                htmlSource = client.DownloadString(url);
            }
        }
        catch (WebException ex)
        {
            // log any exceptions
        }
        return htmlSource;
    }

然后我将XML解析到SOAP-Client方法所在的节点,并将它们添加到一个通用的字符串列表中:

_strXmlFromUrl = GetPageSource(_strWebserviceUrl); // My TestUrl: http://www.webservicex.net/globalweather.asmx?WSDL
XmlDocument xmlDoc = new XmlDocument();
XmlNamespaceManager nmspManager = new XmlNamespaceManager(xmlDoc.NameTable);
nmspManager.AddNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/");
xmlDoc.LoadXml(_strXmlFromUrl);
XmlNodeList methodNodes = xmlDoc.SelectNodes("//wsdl:portType/wsdl:operation[@name]", nmspManager);
List<string> lstMehtodNames = new List<string>();
for (int i = 0; i < methodNodes.Count; i++)
{
    lstMehtodNames.Add(String.Concat(methodNodes[i].ParentNode.Attributes["name"].Value,": " ,methodNodes[i].Attributes[0].Value));
}

玩得开心。

Taragneti