bgmulinari / B1SLayer

A lightweight SAP Business One Service Layer client for .NET

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

.Net 6 WebAPI Error

victorlpb92 opened this issue · comments

Olá,

Ao executar um operação de UPDATE de BusinessPartners em serie todas são efetuadas com sucesso. Porem após algum tempos recebo o seguinte erro.

Call timed out: GET https://.......:50000/b1s/v1/BusinessPartners('C114110');

em B1SLayer.SLConnection.d__451.MoveNext() em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) em B1SLayer.SLRequest.<GetAsync>d__7.MoveNext() em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) em System.Runtime.CompilerServices.TaskAwaiter1.GetResult()
em Rommanel.SAPB1.Data.SAPContext.d__5.MoveNext() em D:\Projetos 2020\Rommanel\Rommanel.SAPB1\Data\SAPContext.cs:linha 292

| InnerException | {"Unable to read data from the transport connection: A operação de E/S foi anulada devido a uma saída de thread ou a uma requisição de aplicativo.."}
  | Source | "System.Net.Http" | string

em System.Net.Http.HttpClient.HandleFailure(Exception e, Boolean telemetryStarted, HttpResponseMessage response, CancellationTokenSource cts, CancellationToken cancellationToken, CancellationTokenSource pendingRequestsCts)
em System.Net.Http.HttpClient.<g__Core|83_0>d.MoveNext()
em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em Flurl.Http.FlurlRequest.d__29.MoveNext()

Olá, @victorlpb92. Para que eu possa tentar simular o problema, você poderia compartilhar um trecho de código onde o problema em questão é reproduzível? A Exception infelizmente não diz muito.

services.AddSingleton(serviceLayer => new SLConnection(***************************************);

public class SAPContext
{
        private SLConnection _serviceLayer;

        public SAPContext(SLConnection serviceLayer)
        {
            _serviceLayer = serviceLayer; 
        }

        public async void BusinessPartnerOBPAUpdate(DTO.OBPA oBPA)
        {
            try
            {
                var businessPartners = await _serviceLayer.Request("BusinessPartners", oBPA.CardCode).GetAsync();

                var updateObject = new OBPAUpdate
                {
                    CreditLimit = Math.Round(Convert.ToDouble(oBPA.CreditLine), 2),
                    MaxCommitment = Math.Round(Convert.ToDouble(oBPA.DebtLine), 2),
                    PeymentMethodCode = "COBCartao_Cred",
                    SalesPersonCode = oBPA.WalletSlpCode,
                    FreeText = oBPA.Free_Text,
                    IntrestRatePercent = Math.Round((double)6, 2)
                };

                if (businessPartners.GroupCode == 100)
                {
                    updateObject.PayTermsGrpCode = 3;
                    updateObject.PriceListNum = 1;
                }
                else
                {
                    updateObject.PayTermsGrpCode = 3;
                    updateObject.PriceListNum = 4;
                }

                await _serviceLayer.Request("BusinessPartners", oBPA.CardCode).PatchAsync(updateObject);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException(exception.Message);
            }
        }
}

O erro parece após esta operação ocorrer múltiplas vezes.

@victorlpb92, pelo que pude ver, a Exception de timeout ocorre na requisição GET. Como você faz esta requisição apenas para verificar o campo "GroupCode", faz sentido você selecionar apenas este campo ao invés de obter o objeto BusinessPartner completo, que é muito maior.

Experimente configurar sua requisição GET especificando com o método Select apenas este campo:

var businessPartners = await _serviceLayer.Request("BusinessPartners", oBPA.CardCode).Select("GroupCode").GetAsync();

Isso fará com que apenas esse campo seja retornado no GET, resultando em melhor performance. Isso pode fazer a diferença se esse método é chamado muitas vezes.

Mesmo com alteraçao e adiconando um System.Threading.Thread.Sleep(500). O error permanece após media de 1:30 executado o processo.

@victorlpb92, pode ser que você esteja com um problema de performance no servidor da Service Layer, visto que não é normal um simples GET resultar em timeout. Se possível, verifique a utilização dos recursos do servidor da Service Layer (CPU e memória) quando seu processo é executado.

Uma alternativa pode ser aumentar o tempo de timeout de suas requisições, configurando-as com o método WithTimeout. Por exemplo:

var businessPartners = await _serviceLayer.Request("BusinessPartners", oBPA.CardCode).Select("GroupCode").WithTimeout(300).GetAsync();

Por hora, não acredito que seu problema esteja relacionado ao B1SLayer.

Vou analisar com cautela e retorno com a solução se encontrar. Ante mãe sua DLL é TOP

@victorlpb92, estou fechando a issue pois imagino que já tenha resolvido seu problema. Se ainda tiver algo a adicionar com relação a isso, me avise que reabro a issue.