Полезное

Разные интересные примеры и важные решения

Get response from PostAsJsonAsync

var httpClient = new HttpClient()

var task = httpClient.PostAsJsonAsync(posturi, model)
	.ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().Result);

// 1. GETTING RESPONSE - NOT ASYNC WAY
task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE!
bool response = task.Result

// 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5 
task.ContinueWith( x => {
	bool response = x.Result
});

// 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5 
bool response = await task;

WARNING: Unable to download from URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' to ''.

Well, I had the same problem. Set my Powershell to TLS 1.2 and it worked for me.

To test this :
1. Open Powershell (As Admin)
2. [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
3. Try it again!

Installing Docker on Windows 2016 Server

To install Docker Enterprise Edition on Windows Server 2016 use the following PowerShell commands:

Install-Module DockerMsftProvider -Force 
Install-Package Docker -ProviderName DockerMsftProvider -Force 

Установка RabbitMQ на Ubuntu 20.04

Внешняя ссылка: https://losst.ru/ustanovka-rabbitmq-v-ubuntu-20-04

Слияние дублей Юридических лиц

В процессе работы зачастую возникают ситуации с дублирование контрагентов - Юридических лиц. В результате вести аналитику и навести порядок не так то просто. Для решения данного вопроса можно использовать следующий процесс: Миграция ЮЛ

Processing LINUXHOST Error: Failed to call RPC function 'FcIsExists': The user name or password is incorrect.

1) Stop the service:
# systemctl stop veeamservice
2) Make database backup:
# mv /var/lib/veeam/veeam_db.sqlite /var/lib/veeam/veeam_db.sqlite.bak
3) Start the service:
# systemctl start veeamservice
4) Wait a few minutes for the database to rebuild
5) Rescan machine in the protection group

LDAP + Имя и Отчество в поле Имя

При настройках интеграции  с LDAP зачастую получается ситуация, что Имя и Отчество пользователя при импорте в ELMA записывается в поле Имя, а поле Отчество остается пустым.

Для решения данной проблемы необходимо в глобальный модуль добавить следующий listener, который будет корректировать данную проблему при добавлении нового пользователя из LDAP: 

using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Runtime.NH.Listeners;
using NHibernate.Event;
using EleWise.ELMA.Security.Models;

namespace MyGlobalModule
{
    [Component]
    public class UserListener : EntityEventsListener
    {
        public override bool OnPreInsert(PreInsertEvent @event)
        {
            var user = @event.Entity as IUser;
            if (user != null && !string.IsNullOrEmpty(user.FirstName))
            {
                var gn = user.FirstName.Split(' ');
                if (gn.Length > 1 && string.IsNullOrEmpty(user.MiddleName))
                {
                    user.FirstName = gn[0];
                    user.MiddleName = gn[1];
                }
            }
            return base.OnPreInsert(@event);
        }
        
        public override bool OnPreUpdate(PreUpdateEvent @event)
        {
            var user = @event.Entity as IUser;
            if (user != null && !string.IsNullOrEmpty(user.FirstName))
            {
                // Fix обновления из LDAP
                var gn = user.FirstName.Split(' ');
                if (gn.Length > 1)
                {
                    user.FirstName = gn[0];
                    if (string.IsNullOrEmpty(user.MiddleName))
	                    user.MiddleName = gn[1];
                }
            }
            return base.OnPreUpdate(@event);
        }
    }
}

Удаление у документа существующих атрибутов

Для атрибутов документов (объектов), созданных в Дизайнере при их удалении из модули, фактического удаления не происходит. Более того, возможны варианты, когда атрибуты являются системными и их не возможно удалить. На примере признака документа "Контроль отправки" рассмотрим вариант как вернуть все обратно.

image.png

Необходимо реализовать процесс с ручным запуском, сделать скрипт со следующим кодом:

public virtual void Process(Context context)
{
  // 744 - пример Id нужного нам типа документа из базы
  var mh = MetadataItemHeaderManager.Instance.Load(744);
  var m = mh.Current; //.Published;
  var metadata = (DocumentMetadata)m.Metadata;

  Logger.Log.ErrorFormat("Start update metadata for {0}", metadata.Name);

  metadata.ControlOnSending = false;

  var sendStatusProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendStatus);
  RemoveSendProperty(sendStatusProperty, metadata);

  var sendDateProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendDate);
  RemoveSendProperty(sendDateProperty, metadata);

  var senderProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendUser);
  RemoveSendProperty(senderProperty, metadata);

  var sendDocumentTypeProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendDocumentType);
  RemoveSendProperty(sendDocumentTypeProperty, metadata);

  var sendNumberProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendNumber);
  RemoveSendProperty(sendNumberProperty, metadata);

  var sendScanCopyProperty = LinqUtils.NameOf<ISendableDocument>(d => d.SendScanCopy);
  RemoveSendProperty(sendScanCopyProperty, metadata);

  m.Metadata = metadata;
  m.Save();
  mh.IsDirtyItem = true;
  mh.Save();
  var mm = new ModelManager();
  mm.Publish("Fix control on send", mh.Id);

  Logger.Log.ErrorFormat("Metadata for {0} published", metadata.Name);
}

private void RemoveSendProperty(string propertyName, DocumentMetadata metadata)
{
  var allProperties = metadata.Properties; //MetadataLoader.GetBaseProperties(metadata);
  Logger.Log.ErrorFormat("Props count: {0}", allProperties.Count);
  var toRemove = allProperties.Where(p1 => p1.Name == propertyName && p1.IsSystem).ToList();
  foreach (var p in toRemove)
  {
    Logger.Log.ErrorFormat("Removed: {0}", p.Name);
    metadata.Properties.Remove(p);
  }
}

Порядок применения:

Обязательно сделайте резервную копию базы данных.