Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
1

Веб-Сервис asmx. Изменение схемы ответа от сервиса

08.12.2015, 12:31. Показов 2821. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Сейчас пищу веб-сервис asmx. Генерировал классы по заданной схеме wsdl.
Столкнулся вот с какой проблемой. После генерации классов и методов, на сервисе была создана операция. Она возвращает вот такой ответ :

XML
1
2
3
4
5
6
7
8
9
10
11
<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>
      <organisationInfoOutDoc xmlns="http://tempuri.org/">
         <fullName></fullName>
         <shortName></shortName>
         <infisCode></infisCode>
         <protocolVersion></protocolVersion>
         <misRelease></misRelease>
      </organisationInfoOutDoc>
   </soap:Body>
</soap:Envelope>


а требуется сделать вот так :

XML
1
2
3
4
5
6
7
8
9
10
11
12
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>
      <ns1:organisationInfoOutDoc>
         <ns1:fullName></ns1:fullName>
         <ns1:shortName></ns1:shortName>
         <ns1:address></ns1:address>
         <ns1:infisCode></ns1:infisCode>
         <ns1:protocolVersion></ns1:protocolVersion>
         <ns1:misRelease></ns1:misRelease>
      </ns1:organisationInfoOutDoc>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Что можно сделать?
Копал в сторону wsdl схемы, по которой генерировался сервис, но с ней вроде бы все в порядке. Описание к методу вот такое :

C#
1
2
3
4
        [System.Web.Services.WebMethodAttribute(Description = "")]
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("organisationInfoOutDoc", Namespace = "http://tempuri.org/")]
public organisationInfoOutDoc getOrganisationInfo([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://tempuri.org/")] organisationInfoInDoc organisationInfoInDoc)
и собственно сами классы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/")]
        public partial class organisationInfoOutDoc {}
 
        [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/")]
        public partial class organisationInfoInDoc {}
Насколько я понял, нужно добавить пространство имен дополнительной? Как это можно сделать? Заранее благодарен!!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2015, 12:31
Ответы с готовыми решениями:

Отправка массива байтов из веб-сервиса asmx
Привет всем! Собственно, то что пытаюсь делать: static public string...

Взаимодействие веб-сервиса asmx и SQL Server 2005
привет! извиняюсь, что данное сообщение находится на другом форуме, т.к. так мне было легче тут...

Поднять asmx-сервер и клиентом на C++ достучаться до методов сервака (как добавить ссылку на веб-сервис?)
Всем доброго времени суток! Стоит задача поднять asmx сервис (сервер) и клиентом на с++...

Как добавить хэш-код в тело ответа веб-сервиса?
Формат ответа на запрос следующий: Первая строка ответа состоит из md5-хэша, далее следует...

13
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
09.12.2015, 02:17 2
Так по сути эти два варианта эквивалентны , и там и тут одно и тоже пространство имен , смущает что во втором случае через префикс ? - это всего лишь один из вариантов оформления документации , не более , на функционал она никак не влияет , можете написать свой wsdl генератор , или - в простом случае просто выгрузить заранее подготовленный wsdl на запрос ?wsdl/

Вообще , сама wsdl схема поддерживает разные навороченные конструкции , которые можно в произвольном виде писать , не влияя при этом на суть происходящего , и добиться аналогов от wsdl генератора через метаданные , во многих случаях невозможно.
0
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
09.12.2015, 13:05  [ТС] 3
Цитата Сообщение от sau Посмотреть сообщение
Так по сути эти два варианта эквивалентны , и там и тут одно и тоже пространство имен , смущает что во втором случае через префикс ? - это всего лишь один из вариантов оформления документации , не более , на функционал она никак не влияет , можете написать свой wsdl генератор , или - в простом случае просто выгрузить заранее подготовленный wsdl на запрос ?wsdl/
Вообще , сама wsdl схема поддерживает разные навороченные конструкции , которые можно в произвольном виде писать , не влияя при этом на суть происходящего , и добиться аналогов от wsdl генератора через метаданные , во многих случаях невозможно.
Насколько я понял, приведенные ответы от сервиса эквивалентны? Но если вдруг разработчики принимающей части настоят на том чтобы ответ на запрос приходил символ в символ как у них, что я могу сделать?
Сам ответ генерирует asmx сервис. Я же не смогу менять его вид?
Может попробовать перехватить ответ и тупо в нём заменить шапку и добавить к тегам префиксы? Если такое возможно, то прошу подсказать каким событием его можно отловить?
Заранее спасибо за ответ!
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
09.12.2015, 16:34 4
https://msdn.microsoft.com/en-... s.90).aspx
и , если будете писать вручную - http://www.w3.org/TR/wsdl
0
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
09.12.2015, 17:39  [ТС] 5
Цитата Сообщение от sau Посмотреть сообщение
https://msdn.microsoft.com/en-us/lib...(v=vs.90).aspx
и , если будете писать вручную - http://www.w3.org/TR/wsdl
Пока не разобрался как поменять WSDL. Видимо я как то не так сам сервис создал ... Не могу найти где находится : On an ASP.NET application, select a Web service provider endpoint.
Есть сам солюшн, в нём 1 проэкт, в нём несколько классов и asmx файл. Где мне найти Web service provider endpoint я не могу понять ...
Я в этом пока ещё новичок.
Хотя вот в чем вопрос. Я создавал этот сервис, сгенерировав его из wsdl файла. Поможет ли замена? (даже если я найду где его поменять )
Схема то у меня сходится, не сходится формат выходного сообщения. Или при замене wsdl формат тоже поменяться?
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
09.12.2015, 17:43 6
Вы уж определитесь где не сходится , в шапке темы Вы про несовпадение схем писали , а теперь выходит , что со схемами все в порядке ) , выходное сообщение - ответ веб.сервиса на запрос к веб.методу ?
0
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
09.12.2015, 17:46  [ТС] 7
Цитата Сообщение от sau Посмотреть сообщение
Вы уж определитесь где не сходится , в шапке темы Вы про несовпадение схем писали , а теперь выходит что со схемами все в порядке ) , выходное сообщение - ответ веб.сервиса на запрос к веб.методу ?
Я по пути разобрался что со схемой все в порядке, несоответствует формат.
Да. Мне нужно поменять формат ответа от Веб-Сервиса на запрос к веб.методу. Это возможно вообще?
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
09.12.2015, 17:52 8
Да , почему нет , посмотреть сгенерированные классы и подправить их , добавить недостающие поля , задать через атрибуты их soap представление и т.п , но это нужно конкретно смотреть , чего там у Вас нагенерировалось , может просто по новой wsdl заново сгенерировать ?

http://habrahabr.ru/post/254165/ (в msdn на asmx документацию уже забили ) - сейчас ее WCF вытеснил.
0
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
09.12.2015, 17:58  [ТС] 9
Цитата Сообщение от sau Посмотреть сообщение
Да , почему нет , посмотреть сгенерированные классы и подправить их , добавить недостающие поля , задать через атрибуты их soap представление и т.п , но это нужно конкретно смотреть , чего там у Вас нагенерировалось , может просто по новой wsdl заново сгенерировать ?
В первом сообщении пример запроса на сервис, ответа от него и атрибутов классов которые им соответсвуют. Поля все есть, весь вопрос в наличии префикса и ns1 и определения самого конверта:
Как нужно
XML
1
2
3
4
5
6
7
8
9
10
11
12
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>
      <ns1:organisationInfoOutDoc>
         <ns1:fullName></ns1:fullName>
         <ns1:shortName></ns1:shortName>
         <ns1:address></ns1:address>
         <ns1:infisCode></ns1:infisCode>
         <ns1:protocolVersion></ns1:protocolVersion>
         <ns1:misRelease></ns1:misRelease>
      </ns1:organisationInfoOutDoc>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
А это как возвращает мой сервис
XML
1
2
3
4
5
6
7
8
9
10
11
<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>
      <organisationInfoOutDoc xmlns="http://tempuri.org/">
         <fullName></fullName>
         <shortName></shortName>
         <infisCode></infisCode>
         <protocolVersion></protocolVersion>
         <misRelease></misRelease>
      </organisationInfoOutDoc>
   </soap:Body>
</soap:Envelope>
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
09.12.2015, 19:17 10
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

Все , понял , я почему то про wsdl подумал ))...

https://msdn.microsoft.com/ru-... s.90).aspx - в общем тут все о форматировании.
еще один вариант , веб метод может возвращать XmlElement - в котором уже сами определяете структуру элементов и их nameсspace-ы.
Была еще когда то библиотека - SoapExtension (https://msdn.microsoft.com/en-... 48814.aspx) , которая давала полный контроль над телом ответа , и которая более не поддерживается . но возможно еще на просторах интернета лежит.

А вообще , я asmx лет 8 уже не юзал , да и в последних студиях даже таких шаблонов не осталось. - что бы поэкспериментировать , так что , чисто по памяти даю советы ). - и почему бы вам не использовать более современные технологии ?
0
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
10.12.2015, 11:35  [ТС] 11
Спасибо за ответ. Попробую разобраться с форматированием
Насчёт новых технологий, вы про WCF? Он более гибкий? Насколько я понял он намного сложнее в конфигурировании, а мне как человеку в веб технологиях новому и с этим то не так просто разобраться было
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
10.12.2015, 17:37 12
Цитата Сообщение от Koyen Посмотреть сообщение
Насколько я понял он намного сложнее в конфигурировании
ну у него гораздо больше возможностей и настроек соответственно , но если только SOAP , то по сути , реализация для Вас будет мало чем отличаться от asmx. - все так же контракты . все так же атрибуты.
1
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 26
11.12.2015, 09:40  [ТС] 13
Спасибо за ответы. В принципе разобрался.
Теперь ещё один вопрос, может быть знаете. Не могу найти какое событие возникает после возврата ответа от веб сервиса. Вопрос в том чтобы увидеть текст ответа в том виде, в котором он передается клиенту.
Как увидеть входящий запрос, разобрался. Сохраняю из через HttpContext.Response. А вот исходящее не могу поймать. Может быть подскажете в какой стороне смотреть хоть? Заранее благодарен.
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
11.12.2015, 16:04 14
http://requestmaker.com/
http://www.telerik.com/fiddler
0
11.12.2015, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2015, 16:04
Помогаю со студенческими работами здесь

Отправка ответа в json формате от службы asmx
Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.ComponentModel...

Изменение адреса для веб-сервиса добавленного через Add Service Reference
Добрый день. Разрабатываю клиента, который будет обращаться к внешнему веб-сервису. Согласно...

Время ответа сервиса
Такой вопрос. Как можно сократить время ответа сервиса? На pagespeed сказано, что надо собирать и...

Получение ответа от сервиса Angular
Как при удалении данных вызвать повторный рефреш списка с сервиса? По логике, это нужно делать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru