Имя: Пароль:
1C
1С v8
Пространство имен при записи XDTO
0 HomoAlbus
 
15.10.14
16:10
Добрый день! Обмениваюсь со сторонним веб сервисом. Создал ws определение и ws прокси.

Вызываю метод веб сервиса - получаю ошибку. Выяснили, что проблема с пространством имен.

У меня:

<soap:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
<soap:Header/>
<soap:Body>
<getList xmlns="http://test_service.ru/"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
<param>test</param>
</getList>
</soap:Body>
</soap:Envelope>

А нужно:

<soap:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:int="http://test_service.ru/">;
<soap:Header/>
<soap:Body>
<int:getList>
<param>test</param>
</int:getList>
</soap:Body>
</soap:Envelope>

Другими словами, нужно пространство имен из GetList перенести в soap:Envelope.

А как это сделать, если 1С сам генерирует soap уровень?
1 tridog
 
15.10.14
16:38
(0) С точки зрения стандарта приведенные фрагменты xml идентичны. Т.е. любой xml parser должен разобрать их одинаково. Уверен, что проблема в этом?

Если уверен - кажется, что способов повлиять на форматирование xml при использовании WSПрокси нет.

Тогда остается вместо WSПрокси самому слать HTTP-запросы. Т.е. самому формировать xml через ЗаписьXML и передавать его в качестве тела в HTTPЗапрос. Правда тогда придется самому разбирать ответ.
2 DmitrO
 
15.10.14
16:39
В первом и во втором варианте элемент getList находится в одном пространстве имен, и оно "http://test_service.ru/";

В первом варианте оно там, потому что объявляется xmlns="http://test_service.ru/"; - пространство имен по умолчанию (когда элемент не квалифицирован префиксом).

Во втором варианте, благодаря объявлению xmlns:int="http://test_service.ru/"; - для этого пространства имен определяется префикс int, но элемент getList там квалифицирован как раз этим префиксом.

А вот вложенный в него элемент param не квалифицирован, оответственно в первом варианте он в пространстве имен по умолчанию, а это "http://test_service.ru/";; а во втором варианте, оно не определено совсем.
3 tridog
 
15.10.14
16:45
(2) Если тип свойства однозначно определен схемой - то зачем его квалифицировать?
4 HomoAlbus
 
15.10.14
17:06
Тут мне еще вариант предложили, оставить как есть и заменить только:
<param>test</param>
на:
<param xmlns="">test</param>

Есть ли возможность при создании xdto как-то явно указать для вложенного элемента xmlns?
5 Chikko
 
15.10.14
17:18
Сталкивался с такой же проблемой. Получилось решить только "собиранием" хмл вручную. Может кто-нибудь подскажет более простой способ?
6 Serginio1
 
15.10.14
17:21
7 Chikko
 
15.10.14
17:25
(6) Спасибо, буду читать!=)
8 HomoAlbus
 
15.10.14
17:34
(6) Какой-то уж очень замороченный способ...
9 Serginio1
 
15.10.14
17:36
(8) И чего там замороченного? Создать библиотеку 1 минута, написать код даже быстрее чем в 1С зная NET.
10 HomoAlbus
 
15.10.14
17:49
(9) Я пролистал весь тред и никак не могу понять как сие можно к данной проблеме применить?
11 Serginio1
 
15.10.14
17:58
(10)  Там смысл такой, что нужно создать клиента  WCF
API IE из 1с 7.7
12 oleg_km
 
15.10.14
18:03
(10) Смысл такой, что в .NET гораздо более приспособлен к работе с сервисами, а http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip  - компонента, которая связывает сборку .NET и 1С. Ну это очень схематично и коротенько. Т.е. в ограниченной по возможностям 1С можно использовать безграничные возможности .NET. Я уже пользую больше года и не мыслю, как можно без этого
13 Serginio1
 
15.10.14
18:09
(12) Кстати в новой версии исправил метод

public object СоздатьКлиентаWCFConfigFile(string ИмяФайла, object TChannel, string endpointConfigurationName, object endpointAddress=null,string UserName=null, string Password=null)
        {
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = ИмяФайла;
            Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
                fileMap,
                ConfigurationUserLevel.None);


            Type ТипКанала = ТипДляСоздатьОбъект(TChannel);
            Type type = typeof(ConfigurationChannelFactory<>);
            Type constructed = type.MakeGenericType(ТипКанала);

            dynamic factory1 = System.Activator.CreateInstance(constructed,
                endpointConfigurationName,
                newConfiguration,
                AutoWrap.ПолучитьРеальныйОбъект(endpointAddress)
                );

            if (!String.IsNullOrWhiteSpace(UserName))
            {

                factory1.Credentials.UserName.UserName = UserName;
                factory1.Credentials.UserName.Password = Password;

            
            }

            //      new ConfigurationChannelFactory<ICalculatorChannel>(
            //          "endpoint1",
            //          newConfiguration,
            //          new EndpointAddress("http://localhost:8000/servicemodelsamples/service";));
            return AutoWrap.ОбернутьОбъект(factory1.CreateChannel());


        }

Добавив =UserName и Password

API IE из 1с 7.7
14 oleg_km
 
15.10.14
18:14
(13) У меня нет работы в веб-сервисами. У меня больше всякие системные вещи: сокеты, ком-порты, бинарные файлы, прямой доступ к скулю и пр. Кстати, большой блок по GDI+, рисую карты Яндекс гораздо быстрее, чем посредством HTML
15 HomoAlbus
 
15.10.14
18:16
(13) Нда, этому делу я точно ума не дам. Придется видимо писать в xml, а потом заменой "param" на "param xmlns=""" менять. А тот xml что получиться по HTTP отправлять...
16 Serginio1
 
15.10.14
18:19
(14) Ясно
17 Serginio1
 
15.10.14
18:25
(14) Кстати работая с ЭДИ пришлось заняться кодогенерацией из xsd.

Вот этот лучше всех разобрал
https://wscfblue.codeplex.com/
https://wscfblue.codeplex.com/discussions/544680

Кстати здесь про подпись
API IE из 1с 7.7
18 Serginio1
 
15.10.14
18:27
19 oleg_km
 
15.10.14
18:56
(17) Так в .NET подписи не по ГОСТ, а у меня только с ЭСФ. У Крипто-ПРО есть сборка для криптографии по ГОСТ, но они за нее денег просят, в принципе 1С-овская устраивает.
20 Serginio1
 
15.10.14
19:04
(19) Ну если поскать на просторах инета то можно найти и по ГОСТУ например

http://code.google.com/p/flashcards-wp7/source/browse/Crypto/BouncyCastle/src/crypto/engines/GOST28147Engine.cs
21 oleg_km
 
15.10.14
19:09
(20) Ну вопрос, будет ли это совместимо с ключевыми носителями Крипто-ПРО? Да и вообще-то противоречит законодательству: стойкие криптопровайдеры могут разрабатывать только разработчики, лицензированные ФСБ.

Ну и задачи нет все переписать на .NET. Только то, что не работает, отсутствует или гораздо проще сделать на .NET. В остальном пусть 1С тоже что-то делает.
22 Serginio1
 
16.10.14
10:43
Кстати а в 1С появилась функция цифровой подписи по ГОСТу?
У меня девчонки подписывают через сайт, а значит есть СОМ библиотеки подписи. Меня просто заинтересовал алгоритм подписи, так как он должен быть открытым
http://habrahabr.ru/post/136022/
23 oleg_km
 
16.10.14
13:54
(22) На 8.2 целый объект - МенеджерКриптографии. На сайте например у лерадаты вроде java-applet, но у разработчика криптопровайдера - Крипто-ПРО есть и COM и .NET-сборка. Алгоритм открытый, но на разработку конкретной реализации нужна лицензия, типа ФСБ проверит: не сделал ли ты закладки.
24 Serginio1
 
16.10.14
16:54
(23) Спасибо, чего то я его пропустил