Intereting Posts
Symfony on Heroku: 403 Forbidden У вас нет прав доступа / доступа на этом сервере где безопасность в PHP 5.4, удалив safe_mode Список покупок в PHP Как публиковать сообщения на своей собственной странице в Facebook? PHP – включить php-файл, а также отправить параметры запроса libphonenumber для php Получение подобной долготы и широты из базы данных Передача данных в памяти на FTP-сервер без использования промежуточного файла После открытия csv-файла в WordPad я не хочу использовать двойные кавычки для имени поля Добавление и доступ к идентификаторам кнопок в таблице, сгенерированной PHP PHP-файл Загрузка и загрузка без использования file_get_contents получение специальных символов из базы данных mysql, php php-ews: Доступ к общим календарям? angularJs POST данные в $ _POST для php Как я могу устранить неполадку, почему мой PHP-скрипт не будет работать в cron, если это произойдет из командной строки?

Как получить доступ к веб-службе PHP из ASP.Net?

Я пытаюсь использовать веб-службу в веб-приложении C # ASP.Net. Служба построена на PHP и находится на каком-то удаленном сервере, который не под моим контролем, поэтому я не могу изменить его, чтобы добавить метаданные или что-то еще в него.

Когда я использую параметр «Добавить веб-ссылку» в Visual Studio 2008, я получаю следующую ошибку:

HTML-документ не содержит информации об обнаружении веб-сервисов.

при попытке добавить следующий веб-сервис.

https://subreg.forpsi.com/robot2/subreg_command.php?wsdl

Функции веб-службы отображаются и отображаются в Visual Studio 2008. Однако я не мог добавить ссылку на нее для использования в приложении ASP.Net.

t3Service "Описание

Методы __construct ()

create_contact ()

get_contact ()

get_domain_info ()

get_last_error_code ()

get_last_error_msg ()

get_NSSET ()

get_owner_mail ()

авторизоваться ( )

register_domain ()

register_domain_with_admin_contacts ()

renew_domain ()

request_sendmail ()

send_auth_info ()

transfer_domain ()

  1. Я также попробовал метод wsdl.exe, извлекая xml и скопировав его в wsdl-файл и создав прокси-класс. Но вывод wsdl содержит предупреждения, а созданный прокси-класс пропускает открытые функции и генерирует что-то вроде этого:

    // CODEGEN: привязка операции 'create_contact' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_contact' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_domain_info' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_last_error_code' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_last_error_msg' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_NSSET' из пространства имен 'urn: t3' игнорировалась. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'get_owner_mail' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'send_auth_info' из пространства имен 'urn: t3' игнорировалась. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'transfer_domain' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'request_sendmail' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: операция «login» из пространства имен «urn: t3» игнорировалась. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'register_domain' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'register_domain_with_admin_contacts' из пространства имен 'urn: t3' игнорировалась. Каждая часть сообщения в сообщении use = encoded должна указывать тип. // CODEGEN: привязка операции 'renew_domain' из пространства имен 'urn: t3' была проигнорирована. Каждая часть сообщения в сообщении use = encoded должна указывать тип.

Редактировать:

Я пробовал этот кусок кода для моего класса с ручным кодированием.

public String makeWebRequest(String methodName) { // Create the web request HttpWebRequest request = WebRequest.Create("https://subreg.forpsi.com/robot2/subreg_command.php/") as HttpWebRequest; // Add authentication to request request.Credentials = new NetworkCredential("foo@mydomain.com", "bar"); request.Method = "POST"; request.ContentType = "text/xml"; request.Headers.Add("SOAPAction: https://subreg.forpsi.com/robot2/subreg_command.php/" + methodName); // Get response using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); // Console application output //Console.WriteLine(reader.ReadToEnd()); return reader.ReadToEnd(); } } 

Но когда я пытаюсь получить ответ, он возвращается

Удаленный сервер ответил на ошибку: (500) Внутренняя ошибка сервера.

В качестве ссылки на это – вам придется передать код своего «прокси» для этой веб-службы.

Один пример ручного вызова веб-службы – возможно, вам придется немного настроить метод.

 private string MakeWebServiceCall(string methodName, string requestXmlString) { WebRequest webRequest = WebRequest.Create("https://subreg.forpsi.com/robot2/subreg_command.php"); HttpWebRequest httpRequest = (HttpWebRequest)webRequest; httpRequest.Method = "POST"; httpRequest.ContentType = "text/xml"; httpRequest.Headers.Add("SOAPAction: https://subreg.forpsi.com/robot2/subreg_command.php/" + methodName); Stream requestStream = httpRequest.GetRequestStream(); //Create Stream and Complete Request StreamWriter streamWriter = new StreamWriter(requestStream); streamWriter.Write(String.Format(this.GetSoapString(), requestXmlString)); streamWriter.Close(); //Get the Response WebResponse webResponse = httpRequest.GetResponse(); Stream responseStream = webResponse.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); //Read the response into an xml document System.Xml.XmlDocument soapResonseXMLDocument = new System.Xml.XmlDocument(); soapResonseXMLDocument.LoadXml(streamReader.ReadToEnd()); //return only the xml representing the response details (inner request) return soapResonseXMLDocument.GetElementsByTagName(methodName + "Result")[0].InnerXml; } 

Я бы рекомендовал создать xsd, который можно использовать для создания объектов (с использованием xsd.exe), а затем вы можете сериализовать / десериализовать ответы и запросы на фактически объекты.

EDIT: метод GetSoapString ()

 private string GetSoapString() { StringBuilder soapRequest = new StringBuilder("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); soapRequest.Append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "); soapRequest.Append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"); soapRequest.Append("{0}"); soapRequest.Append("</soap:Body></soap:Envelope>"); return soapRequest.ToString(); } 

Для справки Стива

Вызов выглядит следующим образом:

 <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/"> <soap:Body> <get_contact> <id>123</id> </get_contact> </soap:Body> </soap:Envelope> 

Отклик:

 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:t3" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:get_contactResponse> <get_contactReturn xsi:type="xsd:boolean">false</get_contactReturn> </ns1:get_contactResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

«webservice» – очень общий термин. Некоторые типы webservice могут реализовать WSDL, но это не требование. IIRC интерфейс SOAP необходим для предоставления WSDL, а поддержка nuSOAP и PHP SOAP поддерживает WSDL. Таким образом, похоже, что удаленный конец не был реализован должным образом.

Изменить. Раньше у меня была ошибка внутреннего сервера 500, потому что моя строка мыла была неправильно отформатирована. Я ananlyzed xml, который возвращается из веб-службы, и построил мое сообщение с мыльной строкой, посмотрев на xml. Наконец, я преодолел проблему с помощью Дэна и некоторых исследований в Интернете. Спасибо, Дэн.

Я преодолел ошибку сервера 500. Теперь я могу получить ответ на ошибку входа по крайней мере …

 public String MyWebServiceCall() { string strSoapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:tns=\"http://www.artwork-systems.com/webway/sessions\" xmlns:types=\"http://www.artwork-systems.com/webway/sessions/encodedTypes\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + " <soap:Body soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + " <tns:Login>" + " <login xsi:type=\"xsd:string\">Support@foo.net</login>" + " <auth xsi:type=\"xsd:string\">bar</auth>" + " </tns:Login>" + " </soap:Body>" + "</soap:Envelope>"; HttpWebRequest req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(@"https://subreg.forpsi.com/robot2/subreg_command.php/")); req.ContentType = "text/xml; charset=UTF-8"; req.Method = "POST"; req.Accept = "text/xml"; req.Headers.Add("SOAPAction", @"https://subreg.forpsi.com/robot2/subreg_command.php/"); req.ProtocolVersion = HttpVersion.Version11; req.Credentials = CredentialCache.DefaultCredentials; //req.Credentials = new NetworkCredential("Support@foo.net", "bar"); StreamWriter stm = new StreamWriter(req.GetRequestStream(), Encoding.ASCII); stm.Write(strSoapMessage); stm.Flush(); stm.Close(); HttpWebResponse wr = (HttpWebResponse)req.GetResponse(); StreamReader srd = new StreamReader(wr.GetResponseStream()); string resulXmlFromWebService = srd.ReadToEnd(); return resulXmlFromWebService; } 

Теперь следующая проблема – передать правильные учетные данные и обработать ответ, чтобы сделать другие вещи …

Кстати, вот был ответ ….

 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:t3" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:loginResponse><loginReturn xsi:type="xsd:boolean">false</loginReturn></ns1:loginResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 

Изменить: значение false является Ok, поскольку я отправляю неправильные учетные данные. Я вызываю другие функции веб-службы аналогичным образом и смог вызвать все функции веб-службы и получить соответствующие возвращаемые значения, а затем выполнить другую обработку.

Спасибо всем, кто помог решить проблему.

С уважением