Taragneti

аюсь получить коллекцию MethodInfo из объекта SOAPClient, который содержит только методы самого веб-сервиса. Вот что я сейчас делаю. На данный момент он возвращает все методы MyServiceSoapClient.

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

Ответы на вопрос(2)

которые можно использовать для более точного выбора методов, которые вы хотите вернуть. Посмотрите здесь:

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 и обнаружил, что [WebMethod] является атрибутом.http://support.microsoft.com/kb/308359 а такжеhttp://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

 Bazzz17 янв. 2011 г., 19:32
Конечно, но я не знаю, какие конкретные методы вы хотели бы вернуть, а какие нет. Я могу привести пример кода с использованием LINQ, который будет более конкретным, если вы предоставите мне свой исходный код. Можете ли вы добавить код вашегоMyServiceSoapClient класс, и укажите, какие методы вы хотели бы вернуть?
 Dunc17 янв. 2011 г., 18:12
Я действительно не хочу добавлять атрибуты к методам самостоятельно. Знаете ли вы, как определить методы, принадлежащие веб-сервису? Запрос linq хорош, но на самом деле не отвечает на вопрос. То, что я ищу, - это свойство, которым можно заменить m.
 Bazzz18 янв. 2011 г., 21:12
Пожалуйста, посмотрите на мой обновленный ответ. Код не совсем совершенен, так как он не обрабатывает ошибки, и я не тестировал этот код, но он должен дать вам представление. Также просмотрите ссылку Codeproject.com в моем ответе на атрибуты.
 Dunc18 янв. 2011 г., 12:52
Методы, которые я хочу вернуть, являются методами веб-службы, то есть методами, помеченными как [WebMethod] в файле asmx. Я хочу исключить методы, которые приходят от клиента SOAP, такие как get_ClientFactory.
 Dunc19 янв. 2011 г., 10:39
Спасибо за это. Я думаю, что мы на правильных линиях. Проблема в том, что метод GetCustomAttributes возвращает пустой массив. Вероятно, это связано с тем, что в файле asmx установлен атрибут WebMethod. Опрашиваемый нами объект создается Visual Studio при добавлении ссылки на службу и не является классом, в котором объявлен атрибут WebMethod.

Сначала я загружаю XML из WSDL:

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-клиента, и добавляю их в общий список строк:

_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

Ваш ответ на вопрос