Uma conexão existente foi forçosamente fechada pelo host remoto

Eu estou trabalhando com um aplicativo comercial que está lançando um SocketException com a mensagem,

Uma conexão existente foi forçosamente fechada pelo host remoto

Isso acontece com uma conexão de soquete entre o cliente e o servidor. A conexão está viva e bem, e pilhas de dados estão sendo transferidas, mas depois se desconectam do nada.

alguém viu isso antes? Quais poderiam ser as causas? Eu posso adivinhar algumas causas, mas também há alguma maneira de adicionar mais a este código para descobrir qual poderia ser a causa?

Quaisquer comentários / idéias são bem-vindos.

… O mais recente …

Eu tenho alguns log de algum rastreamento do .net,

System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0 

Baseado em outras partes do logging eu vi o fato de que ele diz ‘0 # 0’ significa que um pacote de 0 bytes de comprimento está sendo enviado. Mas o que isso realmente significa?

Uma das duas possibilidades está ocorrendo, e não tenho certeza de qual

1) A conexão está sendo fechada, mas os dados estão sendo gravados no soquete, criando assim a exceção acima. O 0 # 0 significa simplesmente que nada foi enviado porque o soquete já estava fechado.

2) A conexão ainda está aberta, e um pacote de zero bytes está sendo enviado (ou seja, o código tem um bug) e o 0 # 0 significa que um pacote de zero bytes está tentando ser enviado.

O que você acha? Pode ser inconclusivo, eu acho, mas talvez alguém tenha visto esse tipo de coisa?

   

Isso geralmente significa que o lado remoto fechou a conexão (geralmente enviando um pacote TCP / IP RST ). Se você estiver trabalhando com um aplicativo de terceiros, as causas prováveis ​​são:

  • Você está enviando dados malformados para o aplicativo
  • O link de rede entre o cliente e o servidor está descendo por algum motivo
  • Você acionou um bug no aplicativo de terceiros que causou a falha
  • O aplicativo de terceiros esgotou os resources do sistema

É provável que o primeiro caso seja o que está acontecendo.

Você pode ativar o Wireshark para ver exatamente o que está acontecendo no fio para diminuir o problema.

Sem informações mais específicas, é improvável que alguém aqui possa realmente ajudá-lo muito.

Isso não é um bug no seu código. Ele vem da implementação do .Net’s Socket. Se você usar a implementação sobrecarregada de EndReceive como abaixo, você não obterá essa exceção.

  SocketError errorCode; int nBytesRec = socket.EndReceive(ar, out errorCode); if (errorCode != SocketError.Success) { nBytesRec = 0; } 

Solução simples para este problema chato comum:

Basta ir ao seu arquivo “.context.cs” (localizado em “ .context.tt”, localizado em seu arquivo “* .edmx”).

Em seguida, adicione esta linha ao seu construtor:

 public DBEntities() : base("name=DBEntities") { this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE ! } 

Espero que isso seja útil.

Tive o mesmo erro. Na verdade, trabalhou no caso do tráfego foi enviado usando algum proxy (violinista no meu caso). Atualizado o framework .NET de 4.5.2 para> = 4.6 e agora tudo funciona bem. O pedido real foi:
new WebClient().DownloadData("URL");
A exceção foi:

SocketException: uma conexão existente foi forçosamente fechada pelo host remoto

O uso do TLS 1.2 resolveu esse erro.
Você pode forçar seu aplicativo usando o TLS 1.2 com isso (certifique-se de executá-lo antes de chamar seu serviço):

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Outra solução
Ative a criptografia forte em sua máquina ou servidor local para usar o TLS1.2, porque, por padrão, ele é desativado, portanto, apenas o TLS1.0 é usado.
Para habilitar a criptografia forte, execute esses comandos no PowerShell com privilégios de administrador:

 Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

Você precisa reiniciar o computador para que essas alterações entrem em vigor.

Eu tenho essa exceção por causa da referência circular na entidade.Em entidade que se parecem

 public class Catalog { public int Id { get; set; } public int ParentId { get; set; } public Catalog Parent { get; set; } public ICollection ChildCatalogs { get; set; } } 

Eu adicionei [IgnoreDataMemberAttribute] à propriedade Parent. E isso resolveu o problema.

Eu tenho essa exceção quando eu estava tentando ler uma linha do database que tinha um nulo em uma coluna enum, não poderia mapear o valor nulo em um valor de enum.

Eu conheci esta exceção, quando a propriedade DateTime da class não está recebendo o valor .I Simplesmente torná-lo anulável DateTime e encontrou a solução.

 public class PlanningBoardBO { ... Other Properties ... public DateTime? PickupDate { get; set; } ... Here changed DateTime to DateTime? } 

Este erro ocorreu na minha aplicação com o protocolo CIP sempre que não enviei ou recebi dados em menos de 10s.

Isso foi causado pelo uso do método aberto para frente. Você pode evitar isso trabalhando com outro método, ou para instalar uma taxa de atualização menor que os 10s que mantêm sua conexão aberta.