Iâm getting strange annoying behavior when executing this code. Anyone else experience this?
Steps:
[ul]
Submit a page that has form data
Execute the line that reads the InputStream ( string content = new System.IO.StreamReader(request.InputStream).ReadToEnd()
Browser Hangs, both browser and code seem to be waiting on each other
Click STOP in the browser
Execution continues to the next line and the content/data is captured!
[/ul]
Why the heck is it stopping executing waiting on the browser when reading the stream???
public static Hashtable GetFormData(System.Net.HttpListenerRequest request)
{
Hashtable formVars = new Hashtable();
try
{
string content = new System.IO.StreamReader(request.InputStream).ReadToEnd();
if (request.ContentType.ToLower() == "application/x-www-form-urlencoded")
{
string[] pairs = content.Split('&');
for (int x = 0; x < pairs.Length; x++)
{
string[] item = pairs[x].Split('=');
formVars.Add(item[0], UAM.InformatiX.SPOT.Web.HttpUtility.UrlDecode(item[1]));
}
}
}
catch (Exception e)
{
}
return formVars;
}
Itâs for the page I am submitting data from. /SignIn.htm in my case.
I am noticing though that the request for the page is sent more than once (added a Debug.Print() in there before adding the formvars). I donât understand why the request is being triggered repeatedly. Is there some async thing I am not accounting for?
I am completely confused. The hang is a hang, regardless if I have crap code causing the 2 requests. And BTW, that is not my case. I donât get 2 requests using the same app code anywhere else, ONLY when I try and ReadToEnd() on this stream. Meaning, if I comment out the stream reader and leave the Debug.Print() in there, it shows one request exactly as expected.
There has to be something about a StreamReader on an InputStream that is causing unexpected behavior.
@ andre: indeed, your suggestion works fine. Thank you. I was about to roll my own read operation here, and I guess that is what it takes.
Not sure why I have to do so much plumbing. Full .NET InpuStream has an EndRead(), and applying StreamReader ReadToEnd() also seems to work with success:
But not for NETMF⌠? So perhaps there is a bug somewhere deep? For what itâs worth, here is more insight into ReadToEnd().
âŚ
The ReadToEnd() line in my code example is literally waiting on something from the browser (not sure why, since the client to server trip should have already completed)
So I put a Breakpoint on the ReadToEnd() line, and I clicked Step Into
Step into: Stepping over non-user code âSystem.Net.HttpListenerRequest.InputStream.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.StreamReaderâ
Step into: Stepping over non-user code âSystem.IO.TextReader.TextReaderâ
Step into: Stepping over non-user code âSystem.MarshalByRefObject.MarshalByRefObjectâ
Step into: Stepping over non-user code âSystem.MarshalByRefObject.MarshalByRefObjectâ
Step into: Stepping over non-user code âSystem.IO.TextReader.TextReaderâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.StreamReaderâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.CanRead.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.CanRead.getâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.CanRead.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.StreamReaderâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.CurrentEncoding.getâ
Step into: Stepping over non-user code âSystem.Text.Encoding.UTF8.getâ
Step into: Stepping over non-user code âSystem.Text.UTF8Encoding.UTF8Encodingâ
Step into: Stepping over non-user code âSystem.Text.Encoding.Encodingâ
Step into: Stepping over non-user code âSystem.Text.Encoding.Encodingâ
Step into: Stepping over non-user code âSystem.Text.UTF8Encoding.UTF8Encodingâ
Step into: Stepping over non-user code âSystem.Text.Encoding.UTF8.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.CurrentEncoding.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.StreamReaderâ
Step into: Stepping over non-user code âSystem.Text.UTF8Encoding.GetDecoderâ
Step into: Stepping over non-user code âSystem.Text.UTF8Decoder.UTF8Decoderâ
Step into: Stepping over non-user code âSystem.Text.Decoder.Decoderâ
Step into: Stepping over non-user code âSystem.Text.Decoder.Decoderâ
Step into: Stepping over non-user code âSystem.Text.UTF8Decoder.UTF8Decoderâ
Step into: Stepping over non-user code âSystem.Text.UTF8Encoding.GetDecoderâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.StreamReaderâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadToEndâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.CanSeek.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.CanSeek.getâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.CanSeek.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadToEndâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.Collections.ArrayList.ArrayListâ
Step into: Stepping over non-user code âSystem.Collections.ArrayList.ArrayListâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
The debugger output stops here.
HANG⌠WAITING ON SOME MYSTERY FEEDBACK FROM BROWSERâŚ
Clicking STOP in the browser allows the ReadToEnd() method to continue, successfully! ???..
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Resetâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Resetâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Available.getâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
Step into: Stepping over non-user code âSystem.Net.Sockets.Socket.Receiveâ
Step into: Stepping over non-user code âSystem.Net.Sockets.NetworkStream.Readâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.ReadInternalâ
Step into: Stepping over non-user code âSystem.Net.InputNetworkStreamWrapper.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.FillBufferAndResetâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.Readâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.Array.Copyâ
Step into: Stepping over non-user code âSystem.Array.Copyâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.Collections.ArrayList.Count.getâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadNonSeekableStreamâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadToEndâ
Step into: Stepping over non-user code âSystem.IO.StreamReader.ReadToEndâ
The program â[5056] Micro Framework application: Managedâ has exited with code 0 (0x0).
At this point, I DO capture the form fields, and the server app continues listening. But itâs pointless if it hangs both client and server in the process! So weird.