Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP-сервис и невадидный запрос / 5 сообщений из 5, страница 1 из 1
11.07.2018, 07:26
    #39672347
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP-сервис и невадидный запрос
Доброго всем дня.
Создал 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
12.07.2018, 09:54
    #39672906
Alesha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP-сервис и невадидный запрос
Попробуйте использовать для типизации данного свойства класс %XML.String
...
Рейтинг: 0 / 0
12.07.2018, 11:38
    #39673008
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP-сервис и невадидный запрос
Alesha,

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

Нам помогало
...
Рейтинг: 0 / 0
24.07.2018, 16:35
    #39678410
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP-сервис и невадидный запрос
Добрый день.
Изменение типа ни к чему не приводит. У меня и так стоял тип %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
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP-сервис и невадидный запрос / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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