Closed victorlpb92 closed 1 year ago
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.
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.d45`1.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.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.TaskAwaiter`1.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()