我正在尝试使用SslStream连接到网站来传递请求,但我收到以下IOException:
无法从传输连接中读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机无法响应而建立的连接失败。
为了更有效地进行测试,我创建了一个独立程序并从此处复制了客户端代码示例代码:http://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx,然后根据另一方的API传递请求。
string Request = "The Request";
TcpClient client = new TcpClient();
client.ReceiveTimeout = 10000; //10 seconds
SslStream sslStream;
string server = "ssl.website.com";
client.Connect(server, 12345);
sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null );
sslStream.AuthenticateAsClient(server,null, SslProtocols.Tls12, false);
StringBuilder messageData = new StringBuilder();
byte[] len = BitConverter.GetBytes(SslClient.GetLen(Request));
messageData.AppendLine("Writing length of data " + SslClient.GetLen(Request).ToString());
sslStream.Write(len);
byte[] msg = Encoding.UTF8.GetBytes(Request);
sslStream.Write(msg);
sslStream.Flush();
byte[] buffer = new byte[2048];
messageData.AppendLine("Writing data " + System.Text.Encoding.UTF8.GetString(msg));
messageData.AppendLine("Is Authenticated? " + sslStream.IsAuthenticated.ToString());
int bytes = -1;
try
{
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.AppendLine(chars.ToString());
if (messageData.ToString().IndexOf("<EOF>") != -1)
{
break;
}
} while (bytes != 0);
}
catch(Exception ex)
{
messageData.AppendLine(ex.Message);
}
return messageData.ToString();
}
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
return false;
}
public static Int16 GetLen(string Request)
{
return Convert.ToInt16(Encoding.UTF8.GetBytes(Request).Length);
}
它失败的部分是sslStream.Read(buffer,0,buffer.Length)。这永远不会返回,也是IOException的来源。
我正在尝试连接的人说SSL握手失败,但我没有看到任何迹象。它总是使它成为sslStread.Read然后失败。他们有时说他们收到请求并发送回复,但我还没有看到回复。
由于
答案 0 :(得分:0)
在与合作伙伴进行一些测试后,结果证明这是我代码中的一个简单错误。必须将长度字节翻转为网络字节顺序。我是使用IPAddress.HostToNetworkOrder
完成的 byte[] len = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(SslClient.GetLen(Request)));
messageData.AppendLine("Writing length of data " + SslClient.GetLen(Request).ToString());
sslStream.Write(len);