|
[Search] Поиск   [Recent Topics] Последние темы   [Hottest Topics] Горячие темы   [Members]  Список участников   [Groups] На главную страницу 
[Register] Регистрация / 
[Login] Вход 
Интеграция на .NET (C#) для новичка  XML
Индекс форума » Компонент МЕРКУРИЙ
Автор Сообщение
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

Vladimir2017

[Avatar]

Зарегистрирован: 02/10/2017 14:31:03
Сообщений: 362
Оффлайн

alsh001 wrote:Здравствуйте, товарищи.

Добрый день! Я писал интеграцию на Дельфи, но после нескольких попыток использовать wsdl понял что это бессмысленная трата времени. Сделал несколько шаблонов XML на диске и каждый раз заполняю их данными. На C# думаю правильнее сделать на объектах и сериализации. Т.е. берете пример из справки (они, как правило, рабочие) вставляете через специальную вставку как классы. Да и одним запросом там не обойдется, надо как-то гасить входящие ВСД, вести склад, прикреплять лаб. исследования и т.д. Не хочу Вас расстраивать, но Вы подписались на несколько месяцев увлекательной разработки
dk

[Avatar]

Зарегистрирован: 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-кодам.
[WWW]
oleg-x


Зарегистрирован: 20/11/2017 11:24:40
Сообщений: 2041
Онлайн

Vladimir2017 wrote:
alsh001 wrote:Здравствуйте, товарищи.

Добрый день! Я писал интеграцию на Дельфи, но после нескольких попыток использовать wsdl понял что это бессмысленная трата времени. Сделал несколько шаблонов XML на диске и каждый раз заполняю их данными. На C# думаю правильнее сделать на объектах и сериализации. Т.е. берете пример из справки (они, как правило, рабочие) вставляете через специальную вставку как классы. Да и одним запросом там не обойдется, надо как-то гасить входящие ВСД, вести склад, прикреплять лаб. исследования и т.д. Не хочу Вас расстраивать, но Вы подписались на несколько месяцев увлекательной разработки

Ну можно не все делать, гашение можно оставить в веб интерфейсе.
А в программе получать остатки/обновлять и делать перевозку. Прикреплять лаб. иследования им скорее всего не требуется, так как они по сути посредники купили - перевезли/продали.
Покрайне мере это можно сделать за месяц. А уже потом улучшать в рабочем режиме. Сделать гашение/инвентаризация/регионализация
https://vk.com/mercuriy_rf
dk

[Avatar]

Зарегистрирован: 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-кодам.
[WWW]
alsh001


Зарегистрирован: 31/05/2020 22:44:36
Сообщений: 3
Оффлайн

Ну ладно..раз нет ни у кого примера, как это должно работать, стал я дальше тестить в Postman и в .net.
И нашел проблему в сериализованном запросе:

точнее 2 проблемы.

1. Эти сервисы работают с camelCase. И если все свойства следуют этим правилам, то классы нет.. По какой-то причине это отсутствует в WSDL.
Если бы в XmlTypeAttribute еще было бы TypeName = "getVetDocumentListRequest", то это бы решило проблему, мне кажется.
Поэтому пришлось делать костыль:

2. Мой метод сериализации работал неправильно, т.к. он не учитывал Namespace из XmlTypeAttribute.
Т.е. рабочий метод выглядит следующим образом (может, кому пригодится в будущем):
alsh001


Зарегистрирован: 31/05/2020 22:44:36
Сообщений: 3
Оффлайн

и тогда метод десериализации ответа будет иметь такой вид:


а весь код отправки запроса и получения результата (упрощённо):
 
Индекс форума » Компонент МЕРКУРИЙ
Перейти:   

Powered by JForum 2.1.8 © JForum Team