Richiamare il flusso non supporta la lettura
-
23-10-2019 - |
Domanda
Ho un'applicazione di rete # c, dove un sacco di utenti anonimi connettersi al (servizio di gioco).
Ora controllare i registri e ogni tanto vedo questa eccezione:
[10:30:18.21352] System.Int32 Read(Byte[], Int32, Int32): The stream does not support reading.
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at BusinessLayer.Listener.ListenerWorker.ProcessClient(Object obj) in File.cs:line 141
Questo errore proviene da un oggetto NetworkStream, ora sto cercando di riprodurre il problema, ma come? Come posso ottenere questa eccezione?
Ho provato io stesso disconnessione, ma che dà solo un timeout, provato altre cose, ma non riesco a farlo funzionare.
Forse qualcuno ha un'idea?
Il contenuto del file è:
private static void ProcessClient(
Object obj)
{
ISession session = (ISession)obj;
NetworkStream networkStream = null;
try
{
DebugUtility.SetThreadName("Worker: {0}", session.Name);
networkStream = session.TcpClient.GetStream();
networkStream.ReadTimeout = Config.ReadTimeout;
// Loop received packets (blocks untill next packet)
Int32 packetSize;
Byte[] buffer = new Byte[session.PacketSize];
while ((packetSize = networkStream.Read(buffer, 0, buffer.Length)) != 0)
{
// Get String from packet bytes
String packet = Encoding.UTF8.GetString(buffer, 0, packetSize);
// Check if packet has data
if (String.IsNullOrEmpty(packet))
continue;
// Log biggest received package
DebugUtility.CheckMaxPacketSize(session.Name, packet.Length);
// Handle packet (in new thread)
Logger.DebugLog("Received: {0}", packet);
ThreadPool.QueueUserWorkItem(session.HandlePacket, packet);
}
}
catch (Exception ex)
{
Logger.LogException(ex);
}
finally
{
if (networkStream != null)
networkStream.Close();
if (session != null)
session.Disconnect();
}
}
Soluzione
Quali sono gli argomenti stai passando nel
System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
Metodo . Si sta utilizzando qualsiasi di NetworkStream.Length o NetworkStream.Position Proprietà.
cioè è somthing come (non esattamente)
System.Net.Sockets.NetworkStream.Read(buffer, stream.Position, stream.Length)
poi come spiegato nella documentazione di MSDN uso di NetworkStream.Length
e NetworkStream.Position
proprietà sarà sempre buttare un NotSupportedException
come la sua non sono attualmente supportate.