OlegTar
@OlegTar
программист .NET, Javascript, Perl

Как вызвать метод SOAP?

Вот есть WSDL rain.kassir.ru:8080/kassirgate/VenueService?wsdl
Нужно вызвать метод getEventList

Я делаю такой код:
string soapEnv = @"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soapenv:Header>
<sas:BasicAuth>
<sas:Name>login</sas:Name>
<sas:Password>password</sas:Password>
</sas:BasicAuth>
</soapenv:Header>
  <soap:Body>
    <getEventList xmlns=""http://services.api.gate.pmisoft.ru/"">
    </getEventList>
  </soap:Body>
</soap:Envelope>";
//запрос
WebRequest request = HttpWebRequest.Create("http://rain.kassir.ru:8080/kassirgate/");
            //
//все эти настройки можешь взять со страницы описания веб сервиса
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.ContentLength = soapEnv.Length;
request.Headers.Add("SOAPAction", "http://rain.kassir.ru:8080/kassirgate/VenueService/getEventList");
//пишем тело
StreamWriter streamWriter = new StreamWriter(request.GetRequestStream());
streamWriter.Write(soapEnv);
streamWriter.Close();
//читаем тело
WebResponse response = request.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
string result = streamReader.ReadToEnd();
Console.WriteLine(result);


И получаю в ответ html-страницу, которая можно получить по этому адресу rain.kassir.ru:8080
Что не так в коде?
Я спрашивал у двух человек, которые вроде как разбираются в SOAP, однако помочь они мне не смогли.
  • Вопрос задан
  • 11804 просмотра
Решения вопроса 1
Illivion
@Illivion
Гораздо проще и правильнее воспользоваться WCF. Создаете проект, кликаете правой кнопкой на на References в дереве проекта, выбираете "Add Service Reference". В окне сверху указываете путь к wsdl, а внизу пространство имен в котором создастся прокси-объект. Я, например, указал namespace "KassirService". Далее что-то подобное:

static void Main(string[] args)
{
     var client = new KassirService.VenueServiceClient();

    client.Open();

    var list = client.getEventList();

    foreach (var evt in list)
    {
         Console.WriteLine(evt.name);
    }

    Console.ReadLine();
}


К сожалению, выполнение этого кода вызывает FaultException (что значит, что исключение инициировано логикой сервиса) с текстом "An error was discovered processing the header". Полагаю, что для доступа к сервису требуются учетные данные, которые можно указать как-то так:

client.ClientCredentials.UserName.UserName = "webServiceUserName";
client.ClientCredentials.UserName.Password = "webServicePassword";


Посмотрите так же, что есть в сети по этому исключению. Например это. Еще есть реализация своего заголовка тут.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ошибка в этой строчке
WebRequest request = HttpWebRequest.Create("http://rain.kassir.ru:8080/kassirgate/");


должно быть
WebRequest request = HttpWebRequest.Create("http://rain.kassir.ru:8080/kassirgate/VenueService/");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы