diadoc / diadocsdk-csharp

Official Diadoc SDK for C#
MIT License
35 stars 64 forks source link

Function failed during execution (-2147467259) #189

Closed tammaco closed 7 years ago

tammaco commented 7 years ago

Добрый вечер! Возникает проблема из title при попытке подписи MessageToPost. Исходный код:

try
    {
        if (postMessage.XmlTorg12SellerTitles != null)
            postMessage.XmlTorg12SellerTitles.forEach(function (m) {
                var attachment = new ActiveXObject("Diadoc.Api.XmlDocumentAttachment");
                var crypt = new ActiveXObject("Diadoc.Api.ComCryptApi");
                var content = new ActiveXObject("Diadoc.Api.SignedContent");

                content.LoadBase64Content(m.Comment);
                crypt.SignBase64Content(m.Comment, certificateThumbprint, "signature");
                content.LoadSignatureFromFile("signature");
                attachment.SetSignedContent(content);
                attachment.CustomDocumentId = m.CustomDocumentId;

                diadocPostMessage.AddXmlTorg12SellerTitle(attachment);
            });
catch (err) {
        showError('Ошибка отправки: ' + GetErrorMessage(err));
    }

P.S. Функции SignBase64Content и LoadBase64Content были дописаны для API, чтобы была доступна возможность подписания документа на клиенте. Они были добавлены давно, библиотека перепересобрана и зарегистрирована. Код работал до обновленмя API до последней версии и перевыпуска сертификата.

public class ComCryptApi : SafeComObject, IComCryptApi
{

public void SignBase64Content(string contentBase64, string thumbprint, string signatureFilename)
        {
            var signatureContent = crypt.Sign(Convert.FromBase64String(contentBase64), crypt.GetCertificateWithPrivateKey(thumbprint).RawData);
            File.Delete(signatureFilename);
            File.WriteAllBytes(signatureFilename, signatureContent);
        }
}

public partial class SignedContent : SafeComObject, ISignedContent
{
public void LoadBase64Content(string contentBase64)
        {
            byte[] content = Convert.FromBase64String(contentBase64);
            if (content != null)
                Content = content;
        }
}

Помогите пожалуйста понять, в чём проблема. Спасибо.

tammaco commented 7 years ago

Правда были ещё warnings при регистраци сборки:

Types registered successfully
Type library exporter warning processing 'Diadoc.Api.IComDiadocApi.GetCounteragents(pageSize), DiadocApi'. 
Warning: Type library exporter encountered a generic type instance in a signature. Generic code may not be exported to COM. Type library exporter warning processing 'Diadoc.Api.Proto.IBox.get_InvoiceFormatVersion(#0), DiadocApi'. 
Warning: Non COM visible value type 'Diadoc.Api.Proto.OrganizationInvoiceFormatVersion' is being referenced either from the type currently being exported or from one of its base types.
Assembly exported to 'C:\...\DiadocApi\DiadocApi\bin\Debug\DiadocApi.tlb', and the type library was registered successfully

Могло ли это повлиять?

tammaco commented 7 years ago

При проверке на боевых сертификатах, ошибка вылезает уже при попытке создания

diadoc = new ActiveXObject("Diadoc.Api.ComDiadocApi2");

Невозможно создание объекта сервером программирования объектов (-2146827859)

Как уже заставить работать вашу новую сборку??? Обратиет же внимание, вы же служба поддержки!

halex2005 commented 7 years ago

Я попробовал создать и использовать COM-объект в JScript:

var diadoc = new ActiveXObject("Diadoc.Api.ComDiadocApi2");
diadoc.Initialize(apiKeyHere, "https://diadoc-api.kontur.ru");
var token = diadoc.AuthenticateWithPassword(loginHere, passwordHere);
print(token);
var box = diadoc.GetMyOrganizations(token);
print(box.Count);

Код отрабатывает без ошибок, все запросы успешны и я вижу корректный вывод на консоль актуальных данных. Это на сборке, зарегистрированной с warnings в консоли.

Сделал Pull Requrest #196 с фиксом warnings при регистрации сборок, но он еще не зарелизен. Если срочно, попробуйте сами собрать ваши изменения с #196-изменениями и попробовать еще раз выполнить ваш код.

Можете попробовать еще раз выполнить регистрацию сборки? Опишите процесс регистрации сборок - как вы его выполняете? Возможно, вы запускаете один bat-файл, попробуйте запустить оба.

tammaco commented 7 years ago

Добрый день! Сборка регистрируется из папки Debug. Может тоже нужна Release версия? И какой второй bat файл имеется в виду? Который unblock?

halex2005 commented 7 years ago

Есть два файла регистрации: Diadoc_Reg.bat и Diadoc_Reg64.bat

tammaco commented 7 years ago

Изначально проблема наверное из-за того, что исходный код вашего SDK был исправлен, добавили пару функций. Тогда ещё не было вариантов сделать это на github. Потом, когда вышла новая версия, решено было не менять полностью весь исходный код (который теперь нужно доставать не просто в архиве, а через powershell, ну да ладно, прогресс....). Заменили файлы новыми, сравнили в TFS - вроде никого не задели и такую сборку зарегистрировали. Наверное это была ошибка и нужно полностью менять весь код и заново дописывать свой функционал. На всякий случай, для чистоты эксперимента, нигде нельзя скачать уже сгененированный C# код, можно без примеров? Я просто удалённый сотрудник, занимаюсь Диадоком после основной работы, поэтому проверить смогу только после 6 вечера.

Спасибо.

17 авг. 2017 г. 10:33 пользователь "Aleksei" notifications@github.com написал:

Есть два файла регистрации: Diadoc_Reg.bat и Diadoc_Reg64.bat

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/diadoc/diadocsdk-csharp/issues/189#issuecomment-322992363, or mute the thread https://github.com/notifications/unsubscribe-auth/AGz5lzE7_0TtUxsXQeVlOFaIJEi_1ci-ks5sY-yrgaJpZM4OuGfC .

halex2005 commented 7 years ago

Github позволяет скачать файлы в ZIP-архиве для любого коммита. Перейдите в коммит, который вас интересует, нажмите "Browse files" и найдите зеленую кнопку "Clone or download" - нажмите и скачайте ZIP.

tammaco commented 7 years ago

Скачала ещё 5 раз и переустановила.... На локальном компьютере создание объекта завершается усепшно. Но на клиенте, у которого есть сертификат сборка зарегистрирована, но объект не создаётся.

16ebe2a

c47e6423

halex2005 commented 7 years ago

Мне не очень нравится строка 1.0.0.0 в InprocServer32 - у свежей сборки DiadocAPI.dll должна быть версия не ниже 1.45.0.0. Вы запускаете bat-файлы регистрации с правами администратора?

tammaco commented 7 years ago

Да, конечно, но у вас в AssemblyVersion.cs написано [assembly: AssemblyVersion("1.0.0.0")]

halex2005 commented 7 years ago

Мы собираем DiadocSDK с помощью файла generate.bat, и DiadocApi.dll который нужен для регистрации берем из файла bin\Release\diadocsdk-csharp-binaries.zip. В этом случае для DiadocApi.dll проставляется корректная версия AssemblyVersion, а также идет ILMerge сборки protobuf-net.dll в сборку DiadocApi.dll.

А как вы его собираете и какую dll используете для регистрации?

tammaco commented 7 years ago

Нам на клиенте нужны только несколько классов из DiadocSDK - для подписания документов и отправки сообщения. Для предыдущих версий на клиентской машине достаточно было просто зарегистрировать DiadocApi.dll, который мы брали из папки bin/Debug (ваш проект был в нашем solution, так как были доработки). Потом ставили cadesplugin и всё работало. С новой версией так не получается.

halex2005 commented 7 years ago

Процесс с ILMerge сборки protobuf-net.dll в сборку DiadocApi.dll у нас существовал всегда. Если вы берете DiadocAPI.dll из папки bin/Debug, убедитесь что рядом лежит как минимум protobuf-net.dll. Если не получается, все-таки, попробуйте получить готовую сборку описанным мной способом и зарегистрировать ее.

halex2005 commented 7 years ago

Вообще, рекомендованный процесс сборки DiadocSDK для C# описан в readme.md

tammaco commented 7 years ago

protobuf-net.dll там естественно был. Теперь добавился и JetBrains. readme говорит сам за себя и не раз прочитан и пункты все выполнены и на сервере всё ок (хотя и там в реестре версия 1.0.0.0). Интересовала именно клиентская машина. Видимо помощь зашла в тупик.