2015-07-12 4 views
2

Я пытаюсь использовать частые веб-службы SAP в консольном приложении .net C# (.NET Framework 4.5).используют SAP Webservice в приложении .net - ошибка аутентификации 401

Веб-сервис sap был создан и активирован мной, повторяя эту статью ->http://scn.sap.com/docs/DOC-38805. Он просто передает «привет мир» при вызове службы.

Веб-служба использует базовый http auth с именем пользователя/паролем. Если я вызываю службу с помощью SoapUI и использую предварительную базовую аутентификацию, я получаю желаемый ответ. Первый пакет запросов, отправленный с клиента на сервер, включает в себя заголовок авторизации, и служба работает правильно.

Ссылаясь на этот документ ->http://scn.sap.com/docs/DOC-38805 Я создал консольное приложение .Net, добавил веб-ссылку и вставить следующий код:

sapref1.Z_HELLO_WORLD_TEST2 client = new sapref1.Z_HELLO_WORLD_TEST2();   
sapref1.Z_ERSMA52_TESTSERVICE client_input = new sapref1.Z_ERSMA52_TESTSERVICE(); 
sapref1.Z_ERSMA52_TESTSERVICEResponse client_response = new sapref1.Z_ERSMA52_TESTSERVICEResponse(); 

client.PreAuthenticate = true; 
client.Credentials = new NetworkCredential("user", "password"); 
client_response = client.Z_ERSMA52_TESTSERVICE(client_input); 

При запуске приложения в первый раз, я получаю ответ от веб-сервис («привет мир»), но если я снова запустил приложение, я всегда получаю несанкционированное исключение. Я проанализировал сетевой трафик с помощью wirehark. Первый запрос, отправленный с клиента, не включает заголовок авторизации, и сервер отвечает кодом ошибки 401, который приводит к указанному исключению.

Я прочитал несколько статей об этой проблеме, но я не нашел решения, которое работает на меня. Есть ли способ использовать веб-службу SAP с прокси-классом, который создается через функцию «добавить веб-ссылку» в VS 2013? Спасибо заранее!

+0

Я добавил утверждения try/catch вокруг кода, и теперь я получаю правильный ответ. Тем не менее в первом запросе отсутствует заголовок авторизации, который приводит к ошибке 401 с сервера. После этого клиент отправляет другое сообщение с данными с учетными данными. Есть ли способ избежать дополнительной поездки в оба конца и отправить учетные данные в первый запрос? btw это работает только в приложении .NET Framework 2 .... – Snyvel

ответ

0

Я не разработчик C#, но this answer, похоже, предлагает работоспособное решение, позволяющее предварительно отправлять данные аутентификации.

+0

Спасибо! Это сработало для меня. – Snyvel