Есть веб-сервис написанный на 1С, опубликован на Апаче.
При попытке вызова его метода пишет:
Запрос HTTP не разрешен для схемы проверки подлинности клиента «Anonymous». От сервера получен заголовок проверки подлинности «Basic realm=»1C:Enterprise 8.2″».
Оно логично, т.к. надо сделать авторизацию, иначе 1С не пустит.
Не понятно только как авторизацию сделать.
Код вида, не помогает:
srvTSD.TSDPortTypeClient ws = new srvTSD.TSDPortTypeClient(«TSDSoap»,»http://localhost/tsd/ws/wsTSD.1cws?wsdl»);
ws.ClientCredentials.UserName.UserName = «web»;
ws.ClientCredentials.UserName.Password = «1»;
ws.ChannelFactory.Credentials.UserName.UserName = «web»;
ws.ChannelFactory.Credentials.UserName.Password = «1»;
ws.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification;
Как протестировать SOAP сервис [GeekBrains]
ws.ClientCredentials.Windows.ClientCredential.UserName = «web»;
ws.ClientCredentials.Windows.ClientCredential.Password = «1»;
ws.ClientCredentials.SupportInteractive = true;
Подскажите чего делать?
Re: Ошибка авторизации при доступе к веб-сервису
От: | Nikolay_Ch |
Дата: | 05.07.13 05:12 |
Оценка: |
Здравствуйте, wraithik, Вы писали:
W>Есть веб-сервис написанный на 1С, опубликован на Апаче.
W>При попытке вызова его метода пишет:
W>
W>Запрос HTTP не разрешен для схемы проверки подлинности клиента «Anonymous». От сервера получен заголовок проверки подлинности «Basic realm=»1C:Enterprise 8.2″».
W>Оно логично, т.к. надо сделать авторизацию, иначе 1С не пустит.
W>Не понятно только как авторизацию сделать.
Re[2]: Ошибка авторизации при доступе к веб-сервису
От: | wraithik |
Дата: | 05.07.13 07:08 |
Оценка: |
Прочитал, не помогло.
System.ServiceModel.EndpointAddress ep = new System.ServiceModel.EndpointAddress(«http://localhost/tsd/ws/wsTSD.1cws?wsdl»); System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding(); binding.Security.Mode =System.ServiceModel.BasicHttpSecurityMode.TransportWithMessageCredential; binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic; srvTSD.TSDPortTypeClient ws = new srvTSD.TSDPortTypeClient(binding, ep);
Он захотел HTTPS. А мне надо через HTTP.
Указанная схема URI «http» недопустима. Ожидалась «https».
Имя параметра: via
Re[3]: Ошибка авторизации при доступе к веб-сервису
1 Введение в веб сервисы
От: | Nikolay_Ch |
Дата: | 05.07.13 07:14 |
Оценка: |
Здравствуйте, wraithik, Вы писали:
W>Он захотел HTTPS. А мне надо через HTTP.
Кто захотел? Web-сервер? Тогда надо там настраивать.
Re[3]: Ошибка авторизации при доступе к веб-сервису
От: | Nikolay_Ch |
Дата: | 05.07.13 07:15 |
Оценка: |
Здравствуйте, wraithik, Вы писали:
W>Он захотел HTTPS. А мне надо через HTTP.
W>
W>Указанная схема URI «http» недопустима. Ожидалась «https».
W>Имя параметра: via
Может вы используете WCF вместо обычного веб-сервиса?
Re[4]: Ошибка авторизации при доступе к веб-сервису
От: | wraithik |
Дата: | 05.07.13 10:17 |
Оценка: |
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Здравствуйте, wraithik, Вы писали:
W>>Он захотел HTTPS. А мне надо через HTTP.
N_C>Кто захотел? Web-сервер? Тогда надо там настраивать.
Проблема решена, через ручную настройку биндинга. Из дома пришлю код.
Re[4]: Ошибка авторизации при доступе к веб-сервису
От: | wraithik |
Дата: | 05.07.13 10:18 |
Оценка: |
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Здравствуйте, wraithik, Вы писали:
W>>Он захотел HTTPS. А мне надо через HTTP.
W>>
W>>Указанная схема URI «http» недопустима. Ожидалась «https».
W>>Имя параметра: via
N_C>Может вы используете WCF вместо обычного веб-сервиса?
Нет, веб-сервис на 1С писан, она про такие умные слова, как WCF, не знает
Re: Вот так надо:
От: | wraithik |
Дата: | 05.07.13 10:52 |
Оценка: |
System.ServiceModel.EndpointAddress ep = new System.ServiceModel.EndpointAddress(«http://localhost/tsd/ws/wsTSD.1cws»);
System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;
srvTSD.TSDPortTypeClient ws = new srvTSD.TSDPortTypeClient(binding, ep);
ws.ClientCredentials.UserName.UserName = «web»;
ws.ClientCredentials.UserName.Password = «1»;
ws.Open();
Источник: www.rsdn.org
PHP Сделать запрос клиента SOAP возвращается 500 Внутренняя ошибка сервера
Я использую PHP для запроса SOAP. У меня есть информация о веб-сервисе от третьего лица. В основном то, что они мне дали: Полный запрос URI (http://xx.xx.xx.xx: xxxxxx/some/services/BasicDo) Имя пользователя Пароль Я довольно новичок, но я немного понимаю, как работает PHP SOAP. Однако в этом примере я нашел URL-адрес, который называется http://xx.xx.xx.xx/services/myservice?wsdl который на самом деле не такой, как у меня со мной.
Дополнительный вопрос здесь, что я должен задать им? Возможно, что такое имя wsdl файла? Также до сих пор у меня есть этот код со мной:
try $client = new SoapClient(«http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl», array(‘login’=>»myusername»,’password’=> «mypwd»));
>
catch(SoapFault $fault) trigger_error(«SOAP Fault: (faultcode: faultcode>, faultstring: faultstring>)», E_USER_ERROR);
>
Но с консоли я получил статус 500 Internal Server Error. Я не знаю, как это может быть, я ожидаю что-то от блока catch. Кто-нибудь, пожалуйста, разъясните мне это. Заранее спасибо.
спросил(а) 2015-03-12T06:22:00+03:00 7 лет, 10 месяцев назад
добавить комментарий
пожаловаться
Я очень ценю все ответы. Я фактически работаю с другой стороной, на которой у меня нет доступа на удаленную сторону. Моя задача — сделать запрос SOAP на сервер. Однако оказалось, что для меня нет веб-сервиса. Поэтому я закончил использовать cURL для отправки необработанного POST запроса SOAP. 🙂
ответил(а) 2015-04-07T11:40:00+03:00 7 лет, 9 месяцев назад
добавить комментарий
пожаловаться
К сожалению, похоже, что бы вы ни пытались (например, передать array(‘exceptions’ => 0) , SoapClient() будет вызывать неуправляемый E_ERROR при проблемах с сетевым подключением. Эта ошибка по-прежнему присутствует как высоко, как PHP 5.5.4 (REF). Резюме: Тестовый скрипт:
Ожидаемый результат: мы должны увидеть «ОК», Фактический результат: Если мы используем error_get_last() register_shutdown_function для отображения содержимого error_get_last() , получаем:
Array
(
[type] => 1
[message] => SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘garbage’ : failed
to load external entity «garbage»
)
Чтобы объяснить, почему вы вдруг получаете эту ошибку, не меняя ничего в своей системе, и объясните, почему SoapClient работает на вашем локальном компьютере, а не на вашей производственной системе, это, скорее всего, проблема с брандмауэром. Вот что сообщил другой человек, который решил свою проблему:
Я решил свою проблему. Это была проблема с моим брандмауэром. Брандмауэр удалял пакеты, отправленные через PHP, но с помощью curl или wget не удалялись. Я добавил правило для всего трафика с этого сервера и увеличил длину пакета, и теперь все работает отлично!
Совет:
Мой лучший совет на этот раз написать код в том же PHP файле, который проверяет, правильно ли разрешает и загружает URL-адрес службы SOAP перед вызовом SoapClient.
Источник: progi.pro
При создании описания сервиса произошла ошибка 1cws wsdl код ответа сервера 500
Обмен данными обычно организовывается с помощью выгрузки файла из одной программы и загрузки в другую. Некоторые программисты предоставляют сторонним программам доступ в SQL базу 1С (что вроде как сильно не рекомендуется).
Термин «обмен данными» не всегда подходит к задаче, иногда более корректно сказать – предоставление данных. Например, внешней программе требуется идентифицировать – существует ли такой клиент в 1С и его баланс.
Предоставление доступа к данным 1С – некорректно по причинам безопасности данных. Необходим скорее механизм проверки по имени и паролю с дальнейшим возвратом баланса.
Этот подход называют – сервисным, когда программа предоставляет не данные, а сервис, который позволяет идентифицировать клиента и узнать его баланс.
Как это работает?
SOA – «сервис ориентированная архитектура» – означает, что программы для обмена данными друг с другом используют «сервисы».
Веб сервис – это набор функций (процедур), которые могут быть вызваны извне программы и базы данных.
Для того, чтобы другая программа знала, что такой «сервис» есть у этой программы, первая на веб сайте выкладывает сведения о своих сервисах. Формат такого описания – файл WSDL.
Функции извне вызываются (запускаются) запросом по протоколу SOAP.
Для передачи параметров и результатов используется XML. Для работы с веб-сервисами Вы должны иметь базовое понимание про XML и XDTO.
Web сервис 1С это способ, с помощью которого можно разрешить запускать некоторые функции 1С снаружи базы 1С, в том числе из других программ или других баз 1С.
Это лучше, чем предоставление прямого доступа к данным 1С, так как при вызове метода (функции) web сервиса 1С, доступ к данным внешняя программа не имеет. Функция на языке 1С самостоятельно определяет право внешней программы получить конкретную толику данных по переданным параметрам (например, имени и паролю).
Web сервис 1С это объект 1С, который находится в конфигурации, в ветке Общие/Web-сервисы.
Так как функционирует web сервис 1С с помощью XML пространство имен и пакет XDTO. XDTO пакеты 1С мы обсуждали ранее.
Во многих случаях, можно не создавать свой пакет XDTO, а использовать по умолчанию – выбрав из списка пакет www.sample-package.org
Методы web сервиса 1С
После этого нужно добавить список функций (методов веб сервиса 1С) – которые будут предоставляться наружу. Называть их лучше англоязычно. Функция может иметь параметры.
Базовые типы к использованию:
- string – строка
- int или integer – целое число
- real – дробное число
- date – дата.
Для каждой добавленной функции веб сервиса 1С, в свойствах нужно создать обработчик, так же, как мы это делали в командах 1С, подписках на событиях 1С и так далее.
Именно эта функция 1С будет выполняться при вызове метода веб сервиса 1С. Не забывайте, что выполняться она будет на сервере 1С. Файловый режим работы 1С с веб-сервисами не рекомендуется.
Функция обычно возвращает какие-либо данные. Обычно указывают тип string и возвращают строку XML.
Строку XML можно сформировать с помощью объектов языка 1С для работы с XML – ДокументDOM и ФабрикаXDTO, а можно просто составить текстовую строку, в которой хранится текст XML.
Публикация web сервиса 1С
Как мы говорили раньше, другие программы должны «знать», что веб сервис 1С существует, имеет такой вот список методов и так далее.
Описание должно лежать на веб сайте. Для этого нужно:
- Иметь веб сайт
- В свойствах web сервиса 1С указать имя файла с расширением 1cws, который является ссылкой на WSDL описание
- Выложить этот файл на веб сайт в конфигураторе с помощью пункта меню Администрирование/Публикация на веб-сервере.
Далее нужно проверить доступность и корректность файла. Для этого зайдите в Internet Explorer по адресу
http://www.ИмяСайта.ru/ПутьНаСайте/ИмяФайла.1cws?wsdl
Браузер должен отобразить некий файл XML (пример файла WSDL здесь http://ru.wikipedia.org/wiki/WSDL), а не ошибку, не пустую страницу и не невнятный текст на любой кодировке.
После успешной публикации web сервис 1С можно использовать. Для этого в другой программе нужно использовать данный интернет адрес для ссылок на веб сервис 1С.
Например, Visual Studio позволяет для любого языка (C++, C#, Visual Basic) – включить в проект web сервис 1С по его WSDL описанию и сгенерировать класс для использования веб-сервиса 1С.
Проголосовать за этот пост:
Источник: howknow1c.ru
веб-сервисы — PHP делает запрос клиента SOAP возвращает 500 Внутренняя ошибка сервера
Я использую PHP, чтобы сделать запрос SOAP. У меня есть информация о веб-сервисе от третьей стороны. В основном то, что они дают мне:
- Полный запрос URI ( Http: //xx.xx.xx.xx: хххххх / некоторые / услуги / BasicDo )
- имя пользователя $client = new SoapClient(«http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl», array(‘login’=>»myusername»,’password’=> «mypwd»)); > catch(SoapFault $fault) < trigger_error(«SOAP Fault: (faultcode: faultcode>, faultstring: faultstring>)», E_USER_ERROR); >
Но из консоли я получил статус 500 Internal Server Error. Я не знаю, как это может быть, я ожидаю что-то от блока catch. Кто-нибудь, пожалуйста, объясните мне это. Заранее спасибо.
Решение
К сожалению похоже независимо от того, что вы пытаетесь (например, прохождение array(‘exceptions’ => 0) , SoapClient() сгенерирует uncatchable E_ERROR при проблемах сетевого подключения. Эта ошибка все еще присутствует до PHP 5.5.4 (REF ).
Ожидаемый результат: мы должны увидеть «ОК»,
Если мы используем register_shutdown_function отображать содержимое error_get_last() , мы получаем:
Array ( [type] => 1 [message] => SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘garbage’ : failed to load external entity «garbage»)
Чтобы объяснить, почему вы вдруг получили эту ошибку, ничего не меняя в своей системе, и объяснить, почему SoapClient работает на вашем локальном компьютере, а не на вашей производственной системе, скорее всего, это брандмауэр вопрос.
Вот что другое человек сообщил, что решил свою проблему:
Я решил свою проблему. Это была проблема с моим брандмауэром.
брандмауэр отбрасывал пакеты, отправленные через PHP, но через curl или wget
не сбрасывается Я добавил правило для всего трафика с этого сервера и
увеличена длина отбрасывания пакетов, и теперь все работает отлично!Совет:
Мой лучший совет на данный момент — написать код в том же PHP-файле, который проверяет, разрешается ли URL-адрес службы SOAP и загружается ли он правильно. до вызывая SoapClient.
Другие решения
Я не уверен, что проблема может быть, но я сделал следующее, чтобы отладить эту проблему, когда я столкнулся с ней
$client = new SoapClient(«http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl», array(‘login’=>»myusername»,’password’=> «mypwd»));
Что вы можете сделать:
- Создайте файл PHP. Назовите это как угодно. Напишите следующий код: ini_set ( ‘display_errors’, ‘On’); $ client = new SoapClient («Http: //xx.xx.xx.xx: ххххх / некоторые / услуги / BasicDo WSDL «, array (‘login’ =>» myusername «, ‘password’ =>» mypwd «));
var_dump ($ клиент);
выход; - Запустите файл.
- Скорее всего, это покажет вам необходимое исключение.
В моем случае наш сервер использовал прокси, который я не передал в параметрах, из-за которых у меня возникла проблема.
Дайте нам знать, как оно идет.Добавьте эти коды в начало файла, чтобы увидеть, где произошла ошибка
ini_set(‘display_errors’,’1′); error_reporting(E_ALL);
Прежде всего вам необходимо убедиться, что у вас есть доступ к SOAP-серверу.
С компьютера, на котором работает ваш php-скрипт, попробуйте получить доступ к файлу wsdl и проверьте, действителен ли он.
Вы можете, например, использовать wget http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl затем откройте сохраненный файл и посмотрите, что вы получаете. Это действительный WSDL?
После того, как вы разобрались с нашим доступом, вам нужно прочитать документацию Вот а также Вот . Вам может потребоваться пройти аутентификацию по-другому или передать другие параметры.
Что касается того, почему блок catch не обрабатывает ваше исключение, вы только ловите SoapFault , Внутренняя ошибка сервера 500 может быть вызвана чем угодно.
Я действительно ценю все ответы. Я на самом деле работаю с другой стороной, к которой у меня нет доступа на удаленной стороне. Моя задача — сделать SOAP-запрос к серверу. Однако оказалось, что веб-сервис для меня НЕТ. Поэтому я в конечном итоге использовал cURL для отправки необработанного запроса SOAP POST.
Источник: web-answers.ru
У меня была внутренняя ошибка сервера 500 при отправке запроса SOAP
Я получаю сообщение об ошибке «POST: http://www.thomas-bayer.com/axis2/services/BLZService?wsdl 500 (внутренняя ошибка сервера) «при попытке отправить запрос SOAP с помощью сценария Java и HTML5. Я вижу эту ошибку в консоли Chrome. Я уже установил подключаемый модуль CORS (для удаления ошибки Allow-control-Allow-origin) и добавлены строки кода для устранения проблемы CORS.
Этот WSDL отлично работает в пользовательском интерфейсе мыла и дает правильный ответ.
function soapReq() < console.log(«Hi»); var str = » » + ‘ ‘ + » + » + » + » + ‘ ‘ + » + » + » + » + ‘66452776’ + » + » + » ; function createCORSRequest(method, url) < var xhr = new XMLHttpRequest(); if («withCredentials» in xhr) < xhr.open(method, url, true); >else if (typeof XDomainRequest != «undefined») < xhr = new XDomainRequest(); xhr.open(method, url); >else < xhr = null; >return xhr; > // Helper method to parse the title tag from the response. function getTitle(text) < return text.match(‘(.*)?’); > // Make the actual CORS request. var url = ‘http://www.thomas-bayer.com/axis2/services/BLZService’; var xhr = createCORSRequest(‘POST’, url); if (!xhr) < alert(‘CORS not supported’); return; >// Response handlers. xhr.onload = function() < var text = xhr.responseText; var title = getTitle(text); alert(‘Response from CORS request to ‘ + url + ‘: ‘ + title); console.log(text); >; xhr.onerror = function() < alert(‘Woops, there was an error making the request.’); >; xhr.setRequestHeader(‘Content-Type’, ‘text/xml’); xhr.send(str); >
Комментарии (6)проблема связана с сервером — вы показали нулевой код для
Это ошибка сервера, вам придется отлаживать ее там, с предоставленной вами информацией невозможно помочь.
Запрос вернет ответ от сервера, который в вашем случае является ошибкой 500. Это будет обрабатываться в консоли браузера. Но на самом деле ошибка находится на стороне вашего сервера. Если у вас есть доступ к консоли сервера, проверьте журнал. Или же сообщите администратору параметры или детали вашего запроса.
Issus находится на стороне сервера. Но вы говорите, что аналогичный запрос, отправленный из пользовательского интерфейса SOAP, выполняется успешно. Вы устанавливаете правильные заголовки запросов?
хорошо, на самом деле это веб-сервис, который я нашел в Интернете, поэтому я понятия не имею о консоли сервера. Ребята, какие-нибудь рабочие, о которых вы знаете?
да, аналогичный запрос в пользовательском интерфейсе мыла дает правильный ответ
Источник: reddeveloper.ru
- Создайте файл PHP. Назовите это как угодно. Напишите следующий код: ini_set ( ‘display_errors’, ‘On’); $ client = new SoapClient («Http: //xx.xx.xx.xx: ххххх / некоторые / услуги / BasicDo WSDL «, array (‘login’ =>» myusername «, ‘password’ =>» mypwd «));