Автор |
Сообщение |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 01/06/2020 00:08:25
|
alsh001
Зарегистрирован: 31/05/2020 22:44:36
Сообщений: 3
Оффлайн
|
Здравствуйте, товарищи.
Хорошим друзьям моей семьи не посчастливилось иметь маленькую фирму, которая закупает молочку у производителя и развозит по магазинам.
А мне не посчастливилось работать программистом, которого попросили решить проблему с каким-то мифическим меркурием, который с недавнего времени имеет место быть.
Из описания их работы я понял, что единственная операция, что будет у них иметь место - Перевозка со сменой владельца (PrepareOutgoingConsignmentOperation) и всё, что для нее требуется..то есть на первый взгляд задача не выглядит невыполнимой.
Проблема в том, что я (хоть и чуть-чуть смыслю в веб) никогда не работал с WCF сервисами и с WSDL.
Создал тестовый проект в VS (.net core 3.1) и импоритовал wsdl (Connected service): http://api.vetrf.ru/schema/platform/services/2.1-RC-last/ams-mercury-g2b.service_v2.1_pilot.wsdl
Первая проблема возникла с авторизацией. Я почему-то считал этот импортированный сервис как какой-то интерфейс или black box, который я только использую и не изменяю.
Но я где-то нарыл (уже не помню где), что нужно изменить в Reference.cs метод GetBindingForEndpoint(EndpointConfiguration endpointConfiguration) и добавить туда
Это вообще нормально? у меня немного волосы дыбом встают от этого. Есть ли более красивое решение для этого?
Но если эту проблему я худо-бедно смог решить, то вторую проблему - до сих пор не могу: ApplicationDataWrapper.Any!
А именно, как правильно сериализовать запрос?
Я попробовал создать простой запрос:
И отправить его
Где мой метод сериализации это:
Первый запрос (submitApplicationRequestAsync) выполняется успешно, а на второй (receiveApplicationResultAsync) я всё время получаю APLM0002 Unsupported application data format.
Я проверил с помощью Fiddler, что там действительно отправляется:
И это сильно разнится с тем, что упоминается в примерах запросов из документации.. Если я, допустим, отправлю следующий запрос из примера через Postman:
то всё выполняется, как следует.. То есть я как-то неправильно импортировал сервис..или неправильно сериализирую запрос..
Может кто-нибудь помочь советом?
Или может быть есть где-нибудь на GitHub/Bitbucket пример проекта, чтобы хоть глянуть, как правильно использовать всю эту петрушку?
Свой проект (если я его когда-нибудь таки завершу) я планирую выложить на гитхаб, дабы помочь будущим товарищам по несчастью...
Спасибо, если кто откликнется.
Александр.
Это сообщение было редактировано 2 раз. Последнее обновление произошло в 01/06/2020 00:12:08
|
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 01/06/2020 09:50:57
|
Vladimir2017
![[Avatar]](/vetrf-forum/images/avatar/e8ad3f3f04296aa9be9de71a674e3769.jpg)
Зарегистрирован: 02/10/2017 14:31:03
Сообщений: 362
Оффлайн
|
alsh001 wrote:Здравствуйте, товарищи.
Добрый день! Я писал интеграцию на Дельфи, но после нескольких попыток использовать wsdl понял что это бессмысленная трата времени. Сделал несколько шаблонов XML на диске и каждый раз заполняю их данными. На C# думаю правильнее сделать на объектах и сериализации. Т.е. берете пример из справки (они, как правило, рабочие) вставляете через специальную вставку как классы. Да и одним запросом там не обойдется, надо как-то гасить входящие ВСД, вести склад, прикреплять лаб. исследования и т.д. Не хочу Вас расстраивать, но Вы подписались на несколько месяцев увлекательной разработки
|
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 01/06/2020 10:33:36
|
dk
![[Avatar]](/vetrf-forum/images/avatar/b1c14790bce31f481f50e49de3542a85.png)
Зарегистрирован: 03/11/2017 00:49:55
Сообщений: 566
Оффлайн
|
alsh001 wrote:Из описания их работы я понял, что единственная операция, что будет у них иметь место - Перевозка со сменой владельца (PrepareOutgoingConsignmentOperation).
Это может быть 5% от того, что необходимо сделать. Самое сложное наладить партионный учёт склада. Вам потребуется сделать минимум 20 команд из 28. Остальное можно делать в личном кабинете ИС Цербере.
Если у вас есть своя ИС, в которой уже много лет без проблем ведётся ведётся партионный учёт и вам нужно только добавить туда Меркурий, то есть смысл сделать это своими силами. И то, на мой взгляд, уже подзно начинать это делать.
А так лучше купить готовую программу, работа в которой уже налажена, многочисленные косяки побеждены и т.п.
У нас, например, всё что вам необходимо будет стоить всего 1000 руб./месяц.
|
https://Меркурий.рус - Автогашение ВСД(от 250 руб. в месяц). Автоудаление просрочки. Выписка ВСД и инвентаризация по сохранённым шаблонам. Тестовый контур - БЕСПЛАТНО.
https://play.google.com/store/apps/details?id=com.skysent.mercury.rus - Android приложение для группового гашения ВСД по QR-кодам. |
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 01/06/2020 10:35:16
|
oleg-x
Зарегистрирован: 20/11/2017 11:24:40
Сообщений: 2047
Оффлайн
|
Vladimir2017 wrote:
alsh001 wrote:Здравствуйте, товарищи.
Добрый день! Я писал интеграцию на Дельфи, но после нескольких попыток использовать wsdl понял что это бессмысленная трата времени. Сделал несколько шаблонов XML на диске и каждый раз заполняю их данными. На C# думаю правильнее сделать на объектах и сериализации. Т.е. берете пример из справки (они, как правило, рабочие) вставляете через специальную вставку как классы. Да и одним запросом там не обойдется, надо как-то гасить входящие ВСД, вести склад, прикреплять лаб. исследования и т.д. Не хочу Вас расстраивать, но Вы подписались на несколько месяцев увлекательной разработки
Ну можно не все делать, гашение можно оставить в веб интерфейсе.
А в программе получать остатки/обновлять и делать перевозку. Прикреплять лаб. иследования им скорее всего не требуется, так как они по сути посредники купили - перевезли/продали.
Покрайне мере это можно сделать за месяц. А уже потом улучшать в рабочем режиме. Сделать гашение/инвентаризация/регионализация
|
https://vk.com/mercuriy_rf |
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 01/06/2020 10:40:15
|
dk
![[Avatar]](/vetrf-forum/images/avatar/b1c14790bce31f481f50e49de3542a85.png)
Зарегистрирован: 03/11/2017 00:49:55
Сообщений: 566
Оффлайн
|
oleg-x wrote:Сделать гашение/инвентаризация/регионализация
Самое главное про склад забыли. А если склад делать, то и гашение лучше сделать, чтобы сразу информацию по складу получать, а не через запрос обновлений(changes).
Так что, если хотите выписывать всё нужно будет сделать, кроме Цербера.
|
https://Меркурий.рус - Автогашение ВСД(от 250 руб. в месяц). Автоудаление просрочки. Выписка ВСД и инвентаризация по сохранённым шаблонам. Тестовый контур - БЕСПЛАТНО.
https://play.google.com/store/apps/details?id=com.skysent.mercury.rus - Android приложение для группового гашения ВСД по QR-кодам. |
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 02/06/2020 21:19:57
|
alsh001
Зарегистрирован: 31/05/2020 22:44:36
Сообщений: 3
Оффлайн
|
Ну ладно..раз нет ни у кого примера, как это должно работать, стал я дальше тестить в Postman и в .net.
И нашел проблему в сериализованном запросе:
точнее 2 проблемы.
1. Эти сервисы работают с camelCase. И если все свойства следуют этим правилам, то классы нет.. По какой-то причине это отсутствует в WSDL.
Если бы в XmlTypeAttribute еще было бы TypeName = "getVetDocumentListRequest", то это бы решило проблему, мне кажется.
Поэтому пришлось делать костыль:
2. Мой метод сериализации работал неправильно, т.к. он не учитывал Namespace из XmlTypeAttribute.
Т.е. рабочий метод выглядит следующим образом (может, кому пригодится в будущем):
|
|
 |
![[Post New]](/vetrf-forum/templates/default/images/icon_minipost_new.gif) 03/06/2020 20:14:28
|
alsh001
Зарегистрирован: 31/05/2020 22:44:36
Сообщений: 3
Оффлайн
|
и тогда метод десериализации ответа будет иметь такой вид:
а весь код отправки запроса и получения результата (упрощённо):
|
|
 |
|
|
|