我目前正在尝试使用TcpClient连接到FTP服务器。 为了使用FTPS作为协议,我将NetworkStream处理为一个单独的方法,该方法使用该方法创建 SslStream ,然后调用 SslStream.AuthenticateAsClient 并抛出异常 A无法在发送时立即完成非阻塞套接字操作。实际流由 TcpClient.GetStream -method初始化。 实际上源代码来自Biko Library,你可以在这里找到这个部分:https://biko.codeplex.com/SourceControl/latest#Biko/Starksoft%20Biko/Net/Ftp/FtpBase.cs
private Stream CreateSslStream(Stream stream)
{
// create an SSL or TLS stream that will close the client's stream
SslStream ssl = new SslStream(stream, true, new RemoteCertificateValidationCallback(secureStream_ValidateServerCertificate), null);
// choose the protocol
SslProtocols protocol = SslProtocols.None;
switch (_securityProtocol)
{
case FtpSecurityProtocol.Tls1OrSsl3Explicit:
case FtpSecurityProtocol.Tls1OrSsl3Implicit:
protocol = SslProtocols.Default;
break;
case FtpSecurityProtocol.Ssl2Explicit:
case FtpSecurityProtocol.Ssl2Implicit:
protocol = SslProtocols.Ssl2;
break;
case FtpSecurityProtocol.Ssl3Explicit:
case FtpSecurityProtocol.Ssl3Implicit:
protocol = SslProtocols.Ssl3;
break;
case FtpSecurityProtocol.Tls1Explicit:
case FtpSecurityProtocol.Tls1Implicit:
protocol = SslProtocols.Tls;
break;
default:
throw new FtpSecureConnectionException(String.Format("unexpected FtpSecurityProtocol type '{0}'", _securityProtocol.ToString()));
}
// note: the server name must match the name on the server certificate.
try
{
// authenticate the client
ssl.AuthenticateAsClient(_host, _clientCertificates, protocol, true);
}
catch (AuthenticationException authEx)
{
throw new FtpAuthenticationException("Secure FTP session certificate authentication failed.", authEx);
}
return ssl;
}
所以,我的问题是,如何修改源代码以便不再抛出此异常?我无法删除身份验证,但错误也会消失。是什么导致了这个错误?
提前致谢。
答案 0 :(得分:1)
固定。 我刚刚更新到新版本的库。问题是由作者通过添加 lock -keywords解决的线程问题引起的。