powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP-сервис и невадидный запрос
5 сообщений из 5, страница 1 из 1
SOAP-сервис и невадидный запрос
    #39672347
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем дня.
Создал SOAP сервис с помощью мастера из wsdl

wsdl
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="myname" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:name">
  <message name="SendBlockRequest">
    <part name="Text" type="xs:string"/>
  </message>
  <message name="SendBlockResponse">
    <part name="return" type="xs:boolean"/>
  </message>
  <message name="GetBlockRequest">
    <part name="Login" type="xs:string"/>
    <part name="Password" type="xs:string"/>
    <part name="Text" type="xs:string"/>
  </message>
  <message name="GetBlockResponse">
    <part name="Text" type="xs:string"/>
    <part name="return" type="xs:boolean"/>
  </message>
  <portType name="Portname">
    <operation name="SendBlock">
      <input message="tns:SendBlockRequest"/>
      <output message="tns:SendBlockResponse"/>
    </operation>
    <operation name="GetBlock">
      <input message="tns:GetBlockRequest"/>
      <output message="tns:GetBlockResponse"/>
    </operation>
  </portType>
  <binding name="MyBinding" type="tns:myname">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="SendBlock">
      <soap:operation soapAction="urn:myname" style="rpc"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="name"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="name"/>
      </output>
    </operation>
    <operation name="GetBlock">
      <soap:operation soapAction="urn:name" style="rpc"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="name"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="name"/>
      </output>
    </operation>
  </binding>
  <service name="myservice">
    <port name="portname" binding="tns:mybinding">
      <soap:address location="http://server/soap"/>
    </port>
  </service>
</definitions>


Всё бы ничего, но от клиентов бывает приходит запрос
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='name' xmlns:types='name'>
<SOAP-ENV:Body SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
<types:GetBlock>
<Login xsi:type="s:string">LOGIN</Login>
<Password xsi:type="s:string">PASSWORD</Password>
<Text xsi:type="s:string"><test></test> </Text>
</types:GetBlock>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


В результате получаю ошибку
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="http://www.w3.org/2001/XMLSchema">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring>Неправильно сформированное SOAP сообщение</faultstring>
         <detail>
            <error xmlns="http://tempuri.org/">
               <text>ОШИБКА #6253: Проверка типа данных завершилась неудачей для тега Text (заканчивается в строке 6 символ 27). Найден непредусмотренный тег &lt;test>.</text>
            </error>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


что в принципе и понятно. Но с клиентами иногда лучше не спорить.
Вопрос, можно ли как-то в сервисе сделать проверку входного запроса и по необходимости подменять символы на &lt и т.п?
Или может как-то переопределить св-во Text , чтобы оно могло быть и типом XML ?


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
SOAP-сервис и невадидный запрос
    #39672906
Alesha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте использовать для типизации данного свойства класс %XML.String
...
Рейтинг: 0 / 0
SOAP-сервис и невадидный запрос
    #39673008
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alesha,

не уверен, что поможет. Насколько я понимаю, парсер сначала распознает текст и создает из нее древовидную структуру, а потом уже на это накладываются классы. И как сделать тег <text></text> не тегом, а контентом - я не знаю.
...
Рейтинг: 0 / 0
SOAP-сервис и невадидный запрос
    #39673093
Alesha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.

Нам помогало
...
Рейтинг: 0 / 0
SOAP-сервис и невадидный запрос
    #39678410
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Изменение типа ни к чему не приводит. У меня и так стоял тип %XML.GlobalCharacterStream
Единственная возможность, которую я откопал, это написать метод
ProcessBody
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Method ProcessBody(action As %String, requestBody As %CharacterStream, ByRef responseBody As %CharacterStream) As %Boolean [ ServerOnly = 1 ]
{


	set ..MsgClass.Login = ???
	set ..MsgClass.Password = ???
	set ..MsgClass.Text = ???
	set ..MsgClass.ECP = ???
	set ..MsgClass.TSP = ???
	
	//вызываем метод
	Set msgService=$this
	d ..InvokeMsgClass(..MsgClass,msgService) 
	
	//формируем ответ
	set body = ..MsgClass
	d responseBody.Clear()
	d responseBody.Write("<types:"_body.%ResponseName_">")	
	d responseBody.Write("<Text xsi:type=""s:string"">"_body.Text_"</Text>")
	d responseBody.Write("<return xsi:type=""s:boolean"">"_$select(body.return:"true",1:"false")_"</return>")
	d responseBody.Write("</types:"_..MsgClass.%ResponseName_">")	

	quit 1
}


в requestBody находится запрос вида
requestBody <types:GetBlock>
<Login xsi:type="s:string">LOGIN</Login>
<Password xsi:type="s:string">PASSWORD</Password>
<Text xsi:type="s:string"><test></test> </Text>
</types:GetBlock>

подскажите как мне из него выдернуть параметры, чтобы подставить их в класс запроса?
Пока у меня не получается. Делал через XML.Reader.Correlate
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP-сервис и невадидный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]