Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.84/204: Рейтинг темы: голосов - 204, средняя оценка - 4.84
62 / 53 / 0
Регистрация: 01.04.2016
Сообщений: 342
1
.NET 4.x

Интеграция с ГИС ЖКХ и подпись SOAP без Крипто .NET и stunnel

06.04.2017, 22:27. Просмотров 39901. Ответов 229


Решил создать отдельную тему, так как в теме Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (4) - C# WCF уже можно заблудиться.

Причиной написания данной куклы/тестового приложения стало желание избавиться от зависимости от Крипто .NET.

За прошедший год с момента начала использования Крипто .NET у меня к нему накопился ряд претензий, таких как:
1. Работа только с одним, своим, криптопровайдером
2. Навязчивая загрузка во все приложения, даже туда, где он не нужен
Как следствие, это приводит к невозможности использования ряда приложений, таких как, например, NUnit Framework


Не хочу сказать ничего плохого в адрес разработчиков КриптоКом.
Они и сами признают на своем форуме, что внедрение чужеродных алгоритмов шифрования в операционные системы Windows это очень непростая задача.
Но все-таки в результате Крипто .NET получился, по моему опыту, настолько глючным, что пользоваться им в работе становится весьма обременительным.

Предлагаемая кукла обеспечивает работу с ГИС ЖКХ без настоятельно навязываемых Ланитом продуктов КриптоКом, таких как stunnel и Крипто .NET.
Для работы используются стандартные вызовы CryptoAPI, так что криптопровайдера установить придется,
соответствующего полученному в УЦ ключу, CryptoPro CSP или ViPNet CSP.

Что было сделано:
1. За основу была взята реализация springjazzy (https://github.com/springjazzy/Xades) выложенная с составе примера начального уровня выложенного Anvano. Учтены/приняты во внимание замечания других участников форума
2. Была написана обертка для работы с CryptoAPI (с использованием найденного куска от Microsoft), в ней был выделен интерфейс ICryptoProvider декларирующий минимально необходимый функционал для подписи
3. Реализация springjazzy из пункта 1 была подвергнута переработке в следующих направлениях:
3.1. Был выкинут весь неиспользуемый функционал класса XadesSignedXml для облегчения чтения и понимания, что там вообще происходит
3.2. Последовательным движением в глубину текстов библиотеки Xades и замены рефлексии методов .NET на куски текста Microsoft удалось избавить класс XadesSignedXml от
криптографии .NET. Вызовы криптографии .NET были заменены на вызовы трех методов ICryptoProvider из п.2

Таким образом, сейчас подпись Xades в данном приложении осуществляется следующим образом:

C#
1
2
ICryptoProvider CryptoProvider = GetCryptoProvider(SigningSertificate);
signedXml.ComputeSignature(CryptoProvider.ComputeHash, CryptoProvider.ComputeSignature, CryptoProvider.ReverseSignature);
где:
  • signedXml - экземпляр класса XadesSignedXml из модифицированной библиотеки
  • ComputeHash - функция расчета хэша вида byte[] ComputeHash(byte[] Data)
  • ComputeSignature - функция расчета подписи вида byte[] ComputeSignature(byte[] Data)
  • ReverseSignature - свойство типа bool, показывающее библиотеке, нужно ли переворачивать полученную подпись:8 Выяснилась занятная деталь: Крипто .NET и CryptoPro CSP оба выдают верные подписи (для одного и того же сертификата), но одну из них нужно зеркально перевернуть, чтобы ее принял ГИС ЖКХ. Почему там сделано - не знаю, это наверное можно спросить в КриптоКом

  • Кукла проверена на машине где установлен как Крипто .NET так и CryptoPro CSP
  • После чего Крипто .NET был удален
  • Компьютер был перезагружен для завершения удаления (два раза, так как с первого раза Крипто .NET удаляться не захотел)
  • После этого осталась работоспособной только часть, работающая через CryptoApi

С ключами Инфотекса у меня в настоящее время возможности проверить работоспособность нет, так как тестовый ключ Инфотекса уже не рабочий.

У кого есть возможность проверить, просьба сообщить о результатах.

Из имеющихся в настоящий момент не исправленных глюков - ошибка связанная с некорректным освобождением памяти при выходе при приложения. Подозреваю, что ошибка где-то в обертке CryptoAPI, но где - пока непонятно.


В прилагаемом архиве исходные тексты куклы и релизная сборка приложения.

Отзывы и конструктивная критика принимаются.

С уважением к участникам форума,
hhmm

Дополнение от 18.10.2018:

В данной теме есть и другие решения предложенные участниками, вынесены в шапку для облегчения навигации:

1. gizmo23 предложил свой вариант библиотеки.
В основу был взят тот же проект signature-demo-net. Все ссылки в сообщении.
Первоначальное обсуждение продолжалось до post10628102

2. umatkot предложил утилиту для проверки работоспособности сервера ГИС ЖКХ. Утилита (по словам автора) использует еще более усовершенствованную версию библиотеки подписи.

3. Дополнение на тему альтернативных криптопровайдеров: месяц назад один из клиентов предоставил на опыты реальный, не тестовый ключ, ViPNet CSP выданный настоящим удостоверяющим центром. Попытка прикрутить провайдера ViPNet CSP к ГИС ЖКХ успехом не увенчалась. Несмотря на то, что на машину удалось установить два криптопровайдера одновременно и каждый из них отдельно видел и успешно читал свои ключи, попытка подключиться с ключом ViPNet CSP к ППАК ГИС ЖКХ не удалась. Проблемы возникли на транспортном уровне, такие же какие бывают у Крипто .Net клиент когда обновляется .Net Framework - 'Unable establish secure SSL/TLS channel to api.dom.dosuslugi.ru'. До подписи дело не дошло.
То ли там что-то еще нужно докупать у Инфотекса, то ли ViPNet CSP не может внедриться на транспортном уровне. В общем, у меня не получилось. Потратил один день, после чего эксперименты прекратил.

Дополнение от 24.01.2018:

4. vst377 предложил набор классов реализующих работу в ГИС ЖКХ файловых сервисов.
11
Вложения
Тип файла: zip GisBusted.zip (4.17 Мб, 288 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2017, 22:27
Ответы с готовыми решениями:

.NET 4.x Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (2)
Начало темы здесь: https://www.cyberforum.ru/web-services-wcf/thread1615223.html umatkot, Да, к...

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (4)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1800721.html Здравствуйте....

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (5)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1840159.html И так мы Я и...

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (3)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1776736.html Кто нибудь знает...

229
8 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 5
22.08.2017, 09:25 41
anton_hz, Лол ))) Крипто-ПРО зачем удалили? кто будет работать с контейнером закрытого ключа?
0
6 / 6 / 0
Регистрация: 21.04.2017
Сообщений: 28
22.08.2017, 09:41 42
Каюсь. Вопрос закрыт. Упустил в теме этот нюанс.
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
27.09.2017, 09:24 43
Всем привет! Кто нибудь может показать пример асинхронного запроса?
Я пытаюсь отправить асинхронный запрос "Импорт пакета документов «Извещение о принятии к исполнению распоряжения», размещаемых исполнителем" (importSupplierNotificationsOfOrderExecution), он проходит без ошибок, но как мне получить MessageGUID запроса - не знаю.

Вот код:
C#
1
Proxy.importSupplierNotificationsOfOrderExecutionAsync(Header, Request);
У метода importSupplierNotificationsOfOrderExecutionAsync есть одна перегрузка, с третьим параметром, но как я понял в него не возвращается MessageGUID, к тому же этот параметр типа object, и он не out.

Как получить MessageGUID?
0
4 / 4 / 0
Регистрация: 10.04.2017
Сообщений: 19
27.09.2017, 10:02 44
daniel_tlk,

C#
1
2
3
PaymentPortsTypeAsyncClient Proxy = new PaymentPortsTypeAsyncClient()
 
Proxy.importSupplierNotificationsOfOrderExecution(RequestHeader, Request, out AckRequest);
как то так
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
27.09.2017, 10:05 45
CCAlek, а можно еще объявление переменной AckRequest?
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
27.09.2017, 10:11 46
CCAlek, ошибка

И не понятно причем тут PaymentDocument.
0
Миниатюры
Интеграция с ГИС ЖКХ и подпись SOAP без Крипто .NET и stunnel  
4 / 4 / 0
Регистрация: 10.04.2017
Сообщений: 19
27.09.2017, 11:38 47
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
        /// Перегружаемая функция для выполнения некоторых действий
        /// </summary>
        protected override void InternalRun()
        {
            System.ServiceModel.Channels.Binding TargetBinding;
            System.ServiceModel.EndpointAddress TargetEndpointAddress;
 
            if (!SoapGetBindingByEndpointName("PaymentPortAsync", out TargetBinding, out TargetEndpointAddress))
            {
                GisGlobals.ErrorMessageBox("Не удалось получить привязки для PaymentPortAsync");
                return;
            }
 
            AckRequest AckRequest;
            HeaderType Header = SoapHeader_Get<HeaderType>();
            RequestHeader RequestHeader = SoapHeader_Get<RequestHeader>();
 
 
            PaymentPortsTypeAsyncClient Proxy = new PaymentPortsTypeAsyncClient(TargetBinding, TargetEndpointAddress);
 
            // настраиваем экземпляр класса клиента для работы
            SoapPrepareQuery(Proxy.Endpoint, Proxy.ClientCredentials);
            
            importNotificationsOfOrderExecutionRequest Request;
            Request = SoapRequest_Get<importNotificationsOfOrderExecutionRequest>();
               
 
                Request.NotificationOfOrderExecutionType = Oplata;
                Proxy.importNotificationsOfOrderExecution(RequestHeader, Request, out AckRequest);
                
        }
Как то так

Добавлено через 1 час 10 минут
daniel_tlk,

Удалите в сгенерированном коде в PaymentDocument[][] лишнюю квадратную скобку
0
11 / 11 / 0
Регистрация: 02.06.2017
Сообщений: 75
03.10.2017, 04:09 48
Уважаемый hhmm!
С недавнего времени Крипто-Про CSP 4 при подписании запроса к ГИС ЖКХ выдает следующее:
С 1 января 2019 года запрещено формирование электронной подписи с помощью ключей ЭП ГОСТ Р 34.10-2001. Вам необходимо перейти на использование ключей ЭП ГОСТ Р 34.10-2012. Продолжить использование ключа ЭП ГОСТ Р 34.10-2001?
И варианты ОК и Отмена. Также есть checbox "не напоминать в течении месяца", который к сожалению не запоминает настройку и не даёт никакого эффекта. Получается, что приходится сидеть и тыкать мышкой каждый раз при подписании запроса программой. Сертификат ЭП действителен еще пол года. Что делать? Может кто-то сталкивался уже с данной проблемой. Есть ли какие-нибудь настройки в самом Крипто-Про?

Добавлено через 15 минут
Сам спросил, сам и отвечаю. Решение проблемы описано тут:
https://support.cryptopro.ru/i... rn_2017-10
В реестр нужно внести соответствующие параметры, которые подавляют данное предупреждение
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
03.10.2017, 10:15 49
vst377, да, они любят удивлять.
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
04.10.2017, 08:02 50
Кто нибудь сталкивался с ошибкой, при вызове метода getState?
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
protected override void InternalRun()
        {
            System.ServiceModel.Channels.Binding TargetBinding;
            System.ServiceModel.EndpointAddress TargetEndpointAddress;
 
            if (!SoapGetBindingByEndpointName("PaymentPortAsync", out TargetBinding, out TargetEndpointAddress))
            {
                GisGlobals.ErrorMessageBox("Не удалось получить привязки для RegPort");
                return;
            }
 
            getStateRequest Request;
            getStateResult12 Result;
            RequestHeader Header = SoapHeader_Get<RequestHeader>();
 
            PaymentPortsTypeAsyncClient Proxy = new PaymentPortsTypeAsyncClient(TargetBinding, TargetEndpointAddress);
 
 
            Request = SoapRequest_Get<getStateRequest>();
            Request.MessageGUID = messageGUID;
 
            try
            {
                SoapPrepareQuery(Proxy.Endpoint, Proxy.ClientCredentials);
                Proxy.getState(Header, Request, out Result);
                //MessageBox.Show(Result.Items[0], "Ошибка");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка");
            }
        }
Я так понял при подписании запроса, происходит ошибка:
0
Миниатюры
Интеграция с ГИС ЖКХ и подпись SOAP без Крипто .NET и stunnel  
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
04.10.2017, 08:02 51
Кто нибудь сталкивался с ошибкой, при вызове метода getState?
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
protected override void InternalRun()
        {
            System.ServiceModel.Channels.Binding TargetBinding;
            System.ServiceModel.EndpointAddress TargetEndpointAddress;
 
            if (!SoapGetBindingByEndpointName("PaymentPortAsync", out TargetBinding, out TargetEndpointAddress))
            {
                GisGlobals.ErrorMessageBox("Не удалось получить привязки для RegPort");
                return;
            }
 
            getStateRequest Request;
            getStateResult12 Result;
            RequestHeader Header = SoapHeader_Get<RequestHeader>();
 
            PaymentPortsTypeAsyncClient Proxy = new PaymentPortsTypeAsyncClient(TargetBinding, TargetEndpointAddress);
 
 
            Request = SoapRequest_Get<getStateRequest>();
            Request.MessageGUID = messageGUID;
 
            try
            {
                SoapPrepareQuery(Proxy.Endpoint, Proxy.ClientCredentials);
                Proxy.getState(Header, Request, out Result);
                //MessageBox.Show(Result.Items[0], "Ошибка");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка");
            }
        }
Я так понял при подписании запроса, происходит ошибка:
0
62 / 53 / 0
Регистрация: 01.04.2016
Сообщений: 342
04.10.2017, 21:45  [ТС] 52
Цитата Сообщение от daniel_tlk Посмотреть сообщение
Кто нибудь сталкивался с ошибкой, при вызове метода getState?
getState не нужно подписывать.
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
05.10.2017, 02:05 53
hhmm, это необходимо реализовывать или GisBusted поддерживает такой функционал?
0
62 / 53 / 0
Регистрация: 01.04.2016
Сообщений: 342
05.10.2017, 10:00  [ТС] 54
Цитата Сообщение от daniel_tlk Посмотреть сообщение
это необходимо реализовывать
Необходимо реализовывать так как это не связано с темой этого топика.
0
11 / 11 / 0
Регистрация: 02.06.2017
Сообщений: 75
11.10.2017, 05:01 55
ГИС ЖКХ продолжает радовать.

В ходе импорта ПУ (importMeteringDeviceData) обнаружил ошибку в описании ответа hm:ImportResult (importMeteringDeviceDataResult). В файле ГИС ЖКХ_Интеграция_v.11.4.0.3\hcs_wsdl_xsd_v.11.4.0.3\house-management\hcs-house-management-types.xsd ответ ErrorMessage находится на одном уровне с CommonResult (мы должны получить один из ответов: или CommonResult, или ErrorMessage). По факту, ГИС ЖКХ выдаёт ErrorMessage внутри CommonResult, что противоречит описанию ImportResult в hcs-house-management-types.xsd в ГИС ЖКХ_Интеграция_v.11.4.0.3 (см. строки с 5638).

Дабы ничего сильно не править в функционале импорта ПУ, для C# проверяйте коллекцию ImportResultCommonResult.Items на наличие объектов типа CommonResultTypeError. Например так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach (ImportResultCommonResult result in commonResults)
{
    ....
    
    foreach(object item in result.Items)
    {
        CommonResultTypeError errMess = item as CommonResultTypeError;
        if (errMess != null)
        {
            Message(
                    "Ошибка импорта ПУ: " +
                    "[" + errMess.ErrorCode.ToString() + "]: " + errMess.Description + ". " +
                    "Трассировка: " + errMess.StackTrace
                    );
        }
    }
    
    ...
}
Уважаемый Hhmm! Как вы относитесь к подобным сообщениям? Они не касаются напрямую вашего проекта. Если они лишние, то дайте знать. Не хочу флудить ))
0
62 / 53 / 0
Регистрация: 01.04.2016
Сообщений: 342
11.10.2017, 11:06  [ТС] 56
Цитата Сообщение от vst377 Посмотреть сообщение
Уважаемый Hhmm! Как вы относитесь к подобным сообщениям? Они не касаются напрямую вашего проекта. Если они лишние, то дайте знать. Не хочу флудить ))
Нормально. Может быть 1 января 2018 года всю эту ГИС ЖКХ выкинут на помойку и этот топик можно будет закрыть, так что он не успеет разрастись до нечитабельного состояния.

Что касается поиска ошибок - для себя я сделал вывод, что в ответе сервера типа CommonResult ошибка может приехать
в трех вариантах:
1. Вместо CommonResult
2. В свойстве Item
3. В свойстве Items

Поэтому я для себя написал рекурсивный разборщик, который ищет ошибки во всех ветках и складывает их в список.

Вырезки приводятся ниже (это не точная копия того, что написано у меня, но материал к размышлению):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
public class Analyzer
    {
    public Analyzer()
        {
        }
 
    #region Вспомогательные функции
 
    /// <summary>
    /// Найти и вернуть значение свойства Item, если оно есть
    /// </summary>
    /// <param name="Result">Объект в котором ищется свойство</param>
    /// <returns>Значение свойства Item</returns>
    public static object GetItemProperty(object Result)
        {
        return GetItemProperty("Item", Result);
        }
 
    /// <summary>
    /// Найти и вернуть значение свойства Name, если оно есть
    /// </summary>
    /// <param name="Name">Название свойства</param>
    /// <param name="Result">Объект в котором ищется свойство</param>
    /// <returns>Значение свойства Item</returns>
    public static object GetItemProperty(string Name, object Result)
        {
        try
            {
            object Item = null;
            Type type = Result.GetType();
 
            if (type == null)
                {
                return null;
                }
 
            PropertyInfo[] props = type.GetProperties();
            foreach (PropertyInfo prop in props)
                {
                if (prop != null)
                    if (prop.Name == Name)
                        {
                        Item = prop.GetValue(Result, null);
                        break;
                        }
                }
            return Item;
            } // end try
        catch (Exception)
            {
            }
        return null;
        }
 
    /// <summary>
    /// Найти и вернуть значения свойства Items, если оно есть
    /// </summary>
    /// <param name="Result">Объект в котором ищется свойство</param>
    /// <returns>Массив объектов Items</returns>
    public static object[] GetItemsProperty(object Result)
        {
        try
            {
            object[] arr = null;
 
            Type type = Result.GetType();
 
            if (type == null)
                {
                return null;
                }
 
            PropertyInfo[] props = type.GetProperties();
 
            foreach (PropertyInfo prop in props)
                {
                if (prop.Name == "Items")
                    {
                    arr = (object[]) prop.GetValue(Result, null);
                    break;
                    }
                }
            return arr;
            } // end try
        catch (Exception)
            {
            }
        return null;
        }
 
    /// <summary>
    /// Анализатор глубины рекурсии
    /// </summary>
    /// <param name="Deep">Текущая глубина рекурсии</param>
    private static void CheckRecursiveDeep(int Deep)
        {
        const int MAX_DEEP = 100;
        if (Deep > MAX_DEEP)
            {
            string err = string.Format("Что-то пошло не так, глубина рекурсии превысила {0}", MAX_DEEP);
            throw new InvalidOperationException(err);
            }
        }
 
    /// <summary>
    /// Добавить объект сообщения в список
    /// </summary>
    /// <param name="ErrorObject">Объект сообщения</param>
    private void SaveErrorObject(SoapErrorObject ErrorObject)
        {
        ErrorObjects.Add(ErrorObject);
        }
 
    #endregion Вспомогательные функции
 
 
    /// <summary>
    /// Поиск ошибок в ответе
    /// </summary>
    /// <param name="Result">Объект</param>
    public void AnalyzeObject(object Result)
        {
        AnalyzeObject(Result, 0);
        }
 
    /// <summary>
    /// Поиск ошибок в ответе
    /// </summary>
    /// <param name="Result">Объект</param>
    /// <param name="Deep">Текущая глубина рекурсии</param>
    private void AnalyzeObject(object Result, int Deep)
        {
        if (Result == null)
            {
            return;
            }
 
        CheckRecursiveDeep(Deep);
 
        #region Тип ErrorMessageType
 
        ErrorMessageType ErrorMessage = Result as ErrorMessageType;
 
        if (ErrorMessage != null)
            {
            SaveErrorObject(ErrorMessage);
            return;
            }
 
        #endregion Тип ErrorMessageType
 
        #region Тип Fault
 
        Fault F = Result as Fault;
 
        if (F != null)
            {
            SaveErrorObject(F);
            return;
            }
 
        #endregion Тип Fault
 
        // Здесь начинается рекурсивный спуск по Item и Items
 
        #region Ищем и анализируем свойство Item
 
        object Item;
        Item = GetItemProperty(Result);
        if (Item != null)
            {
            AnalyzeObject(Item, Deep + 1);
            }
 
        #endregion Ищем и анализируем свойство Item
 
        #region Ищем и анализируем массив в свойстве Items
 
        object[] Items;
        Items = GetItemsProperty(Result);
 
        if (Items != null)
            {
            foreach (object O in Items)
                {
                AnalyzeObject(O, Deep + 1);
                }
            }
 
        #endregion Ищем и анализируем массив в свойстве Items
        }
    }
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
13.10.2017, 09:19 57
vst377, не обязательно прочёсывать все ветки, в надежде найти там ошибку. В XSD чётко прописаны варианты результатов получаемых объектов. В твоём случае имеется структура ImportResult
в ней обозначены два варианта:
public CommonResultType[] CommonResult { get; set; }
public CommonResultTypeError Error { get; set; } - уровень косяка с конкретным объектом при импорте со связкой по TransportGUID импортируемого объекта.
и
public ErrorMessageType[] ErrorMessage { get; set; } - уровень транспорта или логической обработки самой XML до обработки самих объектов.
Такая структура везде.

Сейчас уже ребята из ГИС всё нормально по схемам пихают. Были косяки только с CommonResult по Base, которую ты описал вместо HouseManagement и PaymentDocument[][] - больше косяков не встречалось.
0
11 / 11 / 0
Регистрация: 02.06.2017
Сообщений: 75
13.10.2017, 18:04 58
hhmm, это необходимо реализовывать или GisBusted поддерживает такой функционал?
Класс WorkerBase (GisBusted\Workers\WorkerBase.cs) содержит метод protected void SoapPrepareQuery(...), который отвечает за подпись сообщения (не он один конечно, но из него растут ноги).
Можно изменить его следующим образом:

C#
1
2
3
4
5
6
7
8
protected void SoapPrepareQuery(System.ServiceModel.Description.ServiceEndpoint Endpoint, System.ServiceModel.Description.ClientCredentials ClientCredentials, bool signRequest = true)
{
     // С подписанием запроса
     SoapAddMessageFilter(signRequest, Endpoint);
 
     // если прокси не используется, то установить данные клиента
     SetClientCredentials(ClientCredentials);
}
и в методе getState() вызывать следующим образом:

C#
1
SoapPrepareQuery(port.Endpoint, port.ClientCredentials, false);
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
16.10.2017, 03:33 59
vst377, в методе GetState просто не должно быть Id="signed-data-container" и всё. Процедура подписи проверяет этот флаг и игнорит себя, если его нет.
0
11 / 11 / 0
Регистрация: 02.06.2017
Сообщений: 75
16.10.2017, 05:02 60
umatkot
Цитата Сообщение от umatkot Посмотреть сообщение
и игнорит себя, если его нет.
Не игнорирует, а выпадает вот в такую ошибку:
Значение не может быть неопределенным. Имя параметра: elem (Microsoft.Xades\XadesSignedXml.cs:строка 501)

Смотрим, что там в этой строке:

C#
1
2
3
4
5
6
7
8
9
internal static XmlDocument PreProcessElementInput(XmlElement elem, XmlResolver xmlResolver, string baseUri)
{
    if (elem == null)
        throw new ArgumentNullException("elem");
 
    XmlDocument doc = new XmlDocument(); //стр. 501
    doc.PreserveWhitespace = true;
        //.......
}
Смотрим, что это за elem по вызову метода PreProcessElementInput(elem, xmlResolver, baseUri):
C#
1
2
3
// "signed-data-container"
string idref = GetIdFromLocalUri(reference.Uri, out discardComments);
XmlElement elem = GetIdElement(document, idref);
Как видим, если signed-data-container отсутствует, то Microsoft.Xades.XadesSignedXml.GetSignedInfoHash() в конце концов выдаёт исключение при обработке.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2017, 05:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ
Здравствуйте! Передо мной стоит задача интеграции с системой ГИС ЖКХ...

Осуществить подпись SOAP, по стандартам ГИС ГМП, принятого через TCP сокет
Здравствуйте. Требуется осуществить подпись SOAP, по стандартам ГИС ГМП, принятого через тсп сокет....

Ошибки интеграции ГИС ЖКХ
Я много тут читал форум по интеграции ГИС. На старте, впрочем, как и в последствии возникает много...

Soap, Java, Гис ЖКХ
Добрый день! Имеет ли кто опыт работы с soap в Java? Поставлена задача наладить работу с ГИС ЖКХ,...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.