我正在使用一个商业应用程序,它抛出了一个SocketException消息,

远程主机强制关闭现有连接

这发生在客户端和服务器之间的套接字连接上。连接是正常的,并且正在传输大量数据,但随后突然断开连接。

有人见过这个吗?原因可能是什么?我能猜到一些原因,但是有没有办法在这段代码中添加更多的原因来找出原因是什么?

欢迎任何评论/想法。

... 最新的…

我有一些日志从一些。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

根据日志记录的其他部分,我看到了这样一个事实:它说0#0意味着正在发送一个长度为0字节的数据包。但这到底是什么意思呢?

有两种可能,我不确定是哪一种,

连接正在关闭,但随后数据正在写入套接字,从而创建了上述异常。0#0仅仅意味着没有发送任何东西,因为套接字已经关闭。 连接仍然是打开的,并且正在发送一个零字节的数据包(即代码有一个错误),而0#0意味着一个零字节的数据包正在试图发送。

你怎么看?我猜这可能是不确定的,但也许有人见过这种东西?


当前回答

对我来说,这是因为我试图发送电子邮件的应用服务器没有添加到我们公司的SMTP服务器的允许列表中。 我只需要为应用服务器输入SMTP访问请求。

这是基础设施团队如何添加的(我自己不知道如何执行这些步骤,但这是他们说他们做的):

1.  Log into active L.B.
2.  Select: Local Traffic > iRules > Data Group List
3.  Select the appropriate Data Group
4.  Enter the app server's IP address
5.  Select: Add
6.  Select: Update
7.  Sync config changes

其他回答

对我来说,这是因为我试图发送电子邮件的应用服务器没有添加到我们公司的SMTP服务器的允许列表中。 我只需要为应用服务器输入SMTP访问请求。

这是基础设施团队如何添加的(我自己不知道如何执行这些步骤,但这是他们说他们做的):

1.  Log into active L.B.
2.  Select: Local Traffic > iRules > Data Group List
3.  Select the appropriate Data Group
4.  Enter the app server's IP address
5.  Select: Add
6.  Select: Update
7.  Sync config changes

我得到这个异常是因为实体中的循环引用。在实体中

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

我添加了[IgnoreDataMemberAttribute]到父属性。这样问题就解决了。

在我的情况下,启用IIS服务器,然后重新启动并再次检查。

我也遇到了同样的问题,并最终设法解决了它。在我的例子中,客户端发送请求的端口没有与之绑定SSL证书。因此,我通过将SSL证书绑定到服务器端的端口来解决这个问题。一旦完成了这个操作,这个异常就消失了。

我在使用. net Framework 4.5时遇到了同样的问题。但是,当我将. net版本更新到4.7.2时,连接问题就解决了。也许这是由于安全协议支持的问题。