Результаты поиска
Каков ваш предпочтительный метод отправки сложных данных через веб-сервис?
Это 2008 год, и я все еще разрываюсь на этом. Поэтому я разрабатываю веб-метод, который нуждается в сложном типе, передаваемом в него и возвращаемом из него. Два варианта, с которыми я играю, это:
Передача и возврат реальных бизнес-объектов с данными и поведением. Когда wsdl.exe запускается, он автоматически создает прокси-классы, которые содержат только часть данных, и они будут автоматически преобразованы в мои реальные бизнес-объекты и из них на стороне сервера. На стороне клиента они будут использовать только тупой тип прокси, и им придется сопоставлять их с некоторыми реальными бизнес-объектами, как они считают нужным. Большой недостаток здесь заключается в том, что если я "own" как серверная, так и клиентская сторона, и я хочу использовать один и тот же набор реальных бизнес-объектов, я могу столкнуться с определенными головными болями с конфликтами имен и т. д. (Поскольку реальные объекты и прокси называются одинаково.)
Забудьте о попытке передать "real" бизнес-объектов. Вместо этого просто создайте простые объекты DataTransfer, которые я буду сопоставлять с моими реальными бизнес-объектами вручную. Они все равно копируются в новые прокси-объекты wsdl.exe, но по крайней мере я не обманываю себя, думая, что веб-сервисы могут изначально обрабатывать объекты с бизнес-логикой в них.
Кстати-кто-нибудь знает, как сказать wsdl.exe, чтобы не делать копию объекта? Разве мы не должны просто сказать ему: "Эй, используй этот существующий тип прямо здесь. Не копируйте его!"
Во всяком случае, пока я вроде как остановился на #2, но мне любопытно, что вы все думаете. У меня есть чувство, что есть гораздо лучшие способы сделать это в целом, и я даже не могу быть полностью точным по всем пунктам, поэтому, пожалуйста, дайте мне знать, что вы испытали.
Update: я только что узнал, что VS 2008 имеет возможность повторно использовать существующие типы при добавлении "ссылки на службу", а не создавать совершенно новый идентичный тип в файле прокси. Сладкий.
Исключение soapexception: отсутствует корневой элемент возникает, когда веб-служба .NET называется от Flex
У меня есть веб-приложение .net, которое имеет приложение Flex, встроенное в страницу. Это приложение flex вызывает веб-сервис .net. Я могу trace процесс выполнения через отладчик и все выглядит отлично, пока я не получу ответ:
soap:ReceiverSystem.Web.Services.Protocols.SoapException: Server was unable to process request
. ---> System.Xml.XmlException: Root element is missing.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res)
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
at System.Xml.XmlReader.MoveToContent()
at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent()
at System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement()
at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest
request, HttpResponse response, Boolean& abortProcessing)
--- End of inner exception stack trace ---
Вызов от flex выглядит хорошо, выполнение через веб-сервис хорошо, но это ответ, который я захватываю через wireshark, что здесь происходит?
Я попробовал несколько веб-методов, от "Hello World" до параматизированного methods...all возвращения с тем же ответом...
Я подумал, что это может иметь какое-то отношение к кодированию с помощью "--->",, но я не уверен, как управлять тем, что .net выводит в качестве ответа.
Вызов веб-службы ASP.NET из ASP с помощью SOAPClient
У меня есть веб-сервис ASP.NET с такими функциями, как:
[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
[WebMethod]
public XmlDocument ProcessMessage(XmlDocument message)
{
// ... do stuff
}
}
Я вызываю веб-службу из ASP, используя что-то вроде:
provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
Set service = CreateObject("MSSOAP.SoapClient30")
service.ClientProperty("ServerHTTPRequest") = True
Call service.MSSoapInit(provWSDL)
xmlMessage = "<request><task>....various xml</task></request>"
result = service.ProcessMessage(xmlMessage)
Проблема, с которой я сталкиваюсь, заключается в том, что когда XML достигает метода ProcessMessage, веб-служба plumbing попутно добавила пространство имен по умолчанию. т. е. если я установлю точку останова внутри ProcessMessage (сообщение XmlDocument), я увижу:
<request xmlns="http://internalservice.net/messageprocessing">
<task>....various xml</task>
</request>
Когда я захватываю пакеты по проводу, я вижу, что XML, отправленный инструментарием SOAP, немного отличается от того, что отправлено клиентом .NET WS. Набор инструментов SOAP отправляет:
<SOAP-ENV:Envelope
xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message xmlns:SOAPSDK4="http://internalservice.net/messageprocessing">
<request>
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Если клиент отправляет .NET:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message>
<request xmlns="">
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</soap:Body>
</soap:Envelope>
Прошло так много времени с тех пор, как я использовал инструментарий ASP/SOAP для вызова веб-сервисов .NET, что я не могу вспомнить все умные tricks/SOAP-fu, которые я использовал, чтобы обойти подобные вещи.
Есть какие-нибудь идеи? Одним из решений является создание вызываемого COM .NET прокси, который принимает XML как строковый парам и вызывает WS от моего имени, но это дополнительный уровень сложности/работы, которую я надеялся не делать.
WCF-объекты домена и IExtensibleDataObject
Типичный сценарий. Мы используем старой школы XML internally web-сервисов для обмена данными между серверами фермы и нескольких распределенных и локальных клиентов. Никакие третьи лица не участвуют, только наши приложения, используемые нами и нашими клиентами.
В настоящее время мы размышляем о переходе от модели XML WS к модели WCF/object-based и экспериментируем с различными подходами. Один из них включает в себя передачу объектов домена / агрегатов непосредственно по проводу, возможно, вызывая атрибуты DataContract на них.
Используя IExtensibleDataObject и DataContract с помощью свойства Order на DataMembers, мы должны быть в состоянии справиться с простыми проблемами управления версиями свойств (помните, что мы контролируем всех клиентов и можем легко принудительно обновить их).
Я постоянно слышу, что мы должны использовать выделенные объекты передачи данных только для передачи данных ( DTOs ) по проводу.
Почему? Есть ли еще причина для этого? Мы используем одну и ту же модель домена на стороне сервера и на стороне клиента, конечно, предварительно заполняя коллекции и т. д. только в том случае, когда это считается правильным, и свойства коллекции "necessary." используют принцип Service locator и IoC для вызова либо NHibernate-based "service" для прямой выборки данных (на стороне сервера), либо клиента WCF "service" на стороне клиента для связи с фермой серверов WCF .
Итак-почему мы должны использовать DTOs ?
Отладка веб-службы с помощью пакета SOAP
У меня есть веб-служба, которую я создал в C#, и тестовый жгут, предоставленный моим клиентом. К сожалению, мой веб-сервис, похоже,не анализирует объекты, созданные тестовым жгутом. Я считаю, что проблема заключается в сериализации пакета soap.
Используя TCPTrace, я смог получить пакет soap, переданный веб-службе, но только на удаленной машине, поэтому я не могу отладить его там. Есть ли способ вызвать мой локальный веб-сервис с генерируемым пакетом soap, а не мой текущий тестовый жгут, где я вручную создаю объекты и вызываю веб-сервис через веб-ссылку?
машина, на которой я получил пакет soap, была на виртуальной машине, поэтому я не могу связать ее с моей машиной. Я полагаю, что ищу инструмент, в который можно вставить пакет soap, и он, в свою очередь, вызовет мой веб-сервис
Руководство по выбору между REST и SOAP услугами?
Есть ли у кого-нибудь ссылки на документацию или руководства по принятию решения между REST и SOAP? Я понимаю и то, и другое, но ищу некоторые ссылки на ключевые моменты принятия решений, например, безопасность, которые могут заставить вас склониться к тому или иному.
Как лучше всего использовать веб-сервисы в python?
У меня есть приложение среднего размера, которое работает как веб-сервис .net, который я не контролирую, и я хочу создать свободный pythonic API над ним, чтобы обеспечить легкий сценарий.
Я хотел узнать, что является лучшим / наиболее практичным решением для использования веб-сервисов в python.
Редактировать: Мне нужно потреблять комплекс soap WS и у меня нет никакого контроля над этим.
Чем сгенерировать WSDL из PHP-кода?
Есть некоторое количество классов (в Zend, symfony и другие), которые так или иначе упрощают создание WSDL, но какие-то они мутные.
Хотелось бы генерировать WSDL в IDE, как делают все белые люди принято у дотнетчиков. По слухам старая Zend Studio умела это делать, новая — нет.
А чем генерируете вы?
Чем сгенерировать WSDL из PHP-кода?
Есть некоторое количество классов (в Zend, symfony и другие), которые так или иначе упрощают создание WSDL, но какие-то они мутные.
Хотелось бы генерировать WSDL в IDE, как делают все белые люди принято у дотнетчиков. По слухам старая Zend Studio умела это делать, новая — нет.
А чем генерируете вы?
Как при помощи Zend_Soap_Client выполнить запрос при известной WSDL-схеме?
Имеется объект Zend_Soap_Client. Подключаюсь и выполняю запрос так:
$client = new Zend_Soap_Client($uri,<br>
array(<br>
'login' => $login,<br>
'password' => $password,<br>
'soapVersion' => SOAP_1_1)<br>
);<br><br>
/*<br>
* GetIdentityInfo<br>
*<br>
*/<br><br>
$params = array('Profile' => $profile);<br>
$result = $client->GetIdentityInfo($params);<br>
print($result->GetIdentityInfoResult->any);<br>
print($client->getLastRequest());<br><br>
/*<br>
* SubmitXml<br>
* <br>
*/<br><br>
$request = simplexml_load_file('./request.xml');<br>
$filter = simplexml_load_file('./filter.xml');<br><br>
$request = xml2array($request);<br>
$filter = xml2array($filter);<br><br>
$params = array(<br>
'Profile' => $profile,<br>
'Request' => $request,<br>
'Filter' => $filter);<br><br>
$result1 = $client->SubmitXml($params);<br><br>
function xml2array($xml) {<br>
$arXML=array();<br>
$arXML['name']=trim($xml->getName());<br>
$arXML['value']=trim((string)$xml);<br>
$t=array();<br>
foreach($xml->attributes() as $name => $value) $t[$name]=trim($value);<br>
$arXML['attr']=$t;<br>
$t=array();<br>
foreach($xml->children() as $name => $xmlchild) $t[$name]=xml2array($xmlchild);<br>
$arXML['children']=$t;<br>
return($arXML);<br>
}<br><br>
где $request, $filter — XML-данные (сначала как объект, затем преобразуется в массив).
Имеется WSDL-схема. Существенный кусок привожу ниже:
<s:element name="SubmitXml"><br>
<s:complexType><br>
<s:sequence><br>
<s:element maxOccurs="1" minOccurs="0" name="Profile" type="s:string"/><br>
<s:element maxOccurs="1" minOccurs="0" name="Request"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
<s:element maxOccurs="1" minOccurs="0" name="Filter"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
</s:sequence><br>
</s:complexType><br>
</s:element>
В первом запросе GetIdentityInfo параметр Profile проходит отлично, получаю нормальный ответ.
Во втором запросе SubmitXml параметр Profile также кушает нормально, ибо это type=«s:string». Ругается на Request и Filter ибо это XML в виде массива (или объекта?).
Отвечает:
PHP Fatal error: SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php on line 1113<br/>
PHP Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php:1113
Вопрос: как быть с параметрами Request и Filter? Как мне их корректно передать? Если объект, то в каком виде?
Я вот вижу этот «any» и близок к разгадке…
В каком виде отдать параметр, соответствующий этому описанию?
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType>
$client = new Zend_Soap_Client($uri,<br>
array(<br>
'login' => $login,<br>
'password' => $password,<br>
'soapVersion' => SOAP_1_1)<br>
);<br><br>
/*<br>
* GetIdentityInfo<br>
*<br>
*/<br><br>
$params = array('Profile' => $profile);<br>
$result = $client->GetIdentityInfo($params);<br>
print($result->GetIdentityInfoResult->any);<br>
print($client->getLastRequest());<br><br>
/*<br>
* SubmitXml<br>
* <br>
*/<br><br>
$request = simplexml_load_file('./request.xml');<br>
$filter = simplexml_load_file('./filter.xml');<br><br>
$request = xml2array($request);<br>
$filter = xml2array($filter);<br><br>
$params = array(<br>
'Profile' => $profile,<br>
'Request' => $request,<br>
'Filter' => $filter);<br><br>
$result1 = $client->SubmitXml($params);<br><br>
function xml2array($xml) {<br>
$arXML=array();<br>
$arXML['name']=trim($xml->getName());<br>
$arXML['value']=trim((string)$xml);<br>
$t=array();<br>
foreach($xml->attributes() as $name => $value) $t[$name]=trim($value);<br>
$arXML['attr']=$t;<br>
$t=array();<br>
foreach($xml->children() as $name => $xmlchild) $t[$name]=xml2array($xmlchild);<br>
$arXML['children']=$t;<br>
return($arXML);<br>
}<br><br><s:element name="SubmitXml"><br>
<s:complexType><br>
<s:sequence><br>
<s:element maxOccurs="1" minOccurs="0" name="Profile" type="s:string"/><br>
<s:element maxOccurs="1" minOccurs="0" name="Request"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
<s:element maxOccurs="1" minOccurs="0" name="Filter"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
</s:sequence><br>
</s:complexType><br>
</s:element>PHP Fatal error: SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php on line 1113<br/>
PHP Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php:1113<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType>
php SOAP Extension
Начинаю постигать SOAP, наткнулся на такую проблему: при попытке обращения к соап функции выскакивает фатал еррор Uncaught SoapFault exception: [VersionMismatch] Wrong Version. Ниже приведен код примера.
$client = new SoapClient(
'http://new.starliner.ru/modules/trains/soap/test.wsdl',
array(
'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
)
);
$result = $client->trainRoute(array('day'=>'12', 'month' => '12', 'train' => '066А'));
Гугл показал что проблема такая возникает часто, а решения так и не дал.
Так в чем же соль?
'http://new.starliner.ru/modules/trains/soap/test.wsdl',
array(
'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
)
);
$result = $client->trainRoute(array('day'=>'12', 'month' => '12', 'train' => '066А'));