Доступ к блоку кода Navision через веб-сервис (xml)

Я пытаюсь получить доступ к веб-службе Navision 2009 R2, генерируя сообщение SOAP из C#. Я получаю ответ только в том случае, если функция codeunit, которую я вызываю, не имеет параметров.

Пример функции codeunit RunJob Test (без параметров, возвращает жестко заданную строку):

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Test xmlns="urn:microsoft-dynamics-schemas/codeunit/runjob">
</Test>
</soap:Body>
</soap:Envelope>

В результате я получаю эту строку...

Пример для той же кодовой единицы RunJob, функция RunJob (принимает 1 строковый параметр с именем parameter, возвращает внутреннюю ошибку сервера):

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RunJob xmlns="urn:microsoft-dynamics-schemas/codeunit/runjob">
<parameter>aaaa</parameter>
</RunJob>
</soap:Body>
</soap:Envelope>

В результате я получаю сообщение об ошибке (WebResponse wr = request.GetResponse();) вместо необходимой информации.

Самое интересное, что раньше это работало. Единственные изменения (как по мне) - была установлена ​​NAV 2013.

Кто-нибудь сталкивался с такой же проблемой или знает решение?

P.S. Вот часть определения веб-службы для функции RunJob:

<element name="Runjob">
<complexType>
<sequence>
<element minOccurs="1" maxOccurs="1" name="parameter" type="string"/>
</sequence>
</complexType>
</element>
<element name="Runjob_Result">
<complexType>
<sequence>
<element minOccurs="1" maxOccurs="1" name="return_value" type="string"/>
</sequence>
</complexType>
</element>

person user1390456    schedule 16.05.2013    source источник


Ответы (2)


Все дело было в именовании функций/переменных. Первая буква каждого параметра функции должна быть маленькой. Тело SOAP должно быть таким ("codeunit" пишется строчными буквами, но его имя отображается в NAV)

<RunJob xmlns="urn:microsoft-dynamics-schemas/codeunit/RunJob">
...params...
</RunJob>

Заголовок запроса (имя codeunit в нижнем регистре, имя функции как есть)

"urn:microsoft-dynamics-schemas/codeunit/runjob:RunJob"
person user1390456    schedule 26.09.2013

Звучит неловко, но попробуй поставить

<soap:Body><RunJob xmlns="urn:microsoft-dynamics-schemas/codeunit/runjob">

в одну строку, то есть без возврата каретки между Body и RunJob.

person Mak Sim    schedule 21.06.2013
comment
Я пишу весь запрос в одну строку. Каретки в приведенном выше примере предназначены только для удобства чтения. - person user1390456; 21.06.2013
comment
Http 500 в большинстве случаев означает проблемы с запросом. Попробуйте сгенерировать образец запроса с помощью любого инструмента, потребляющего ws, например SOAPui. Ночные сборки soapui могут работать с Nav ws и NTLM-аутентификацией. - person Mak Sim; 24.06.2013
comment
Да, я использую SOAPui, фрагменты XML в моем вопросе взяты оттуда (оба запроса/ответа, которые я делаю/получаю с помощью SOAPui, равны запросам/ответам, сделанным из C#). А раньше (~2 месяца назад) SOAPui успешно справлялся с передачей параметров функции и получал корректный ответ от WS. Я не могу представить, что пошло не так: ни код C#, ни что-либо еще не менялось, я просто отложил этот проект, а когда вернулся к нему, функции с параметрами перестали работать. Единственное, что получилось - установка NAV 2013 параллельно NAV 2009 R2 во время той паузы - person user1390456; 24.06.2013
comment
Может быть, служба, установленная Nav7, просто перезаписала вашу службу с тем же именем, и теперь вы используете не тот веб-сервис? Или они используют один и тот же порт, что и вызывает ошибки. Попробуйте повторно использовать wsdl с soapui. Также попробуйте перекомпилировать Nav codeunit. Если вы использовали некоторые переменные автоматизации, а затем удалили необходимые библиотеки, это может не сработать. - person Mak Sim; 26.06.2013
comment
И если ничего не работает, вы можете использовать режим отладки для создания кода С# и отладить свой конкретный запрос, чтобы увидеть, где он дает сбой. - person Mak Sim; 26.06.2013