I am trying to connect to an existing Service that listens for POSTS and responds with data. Please note: The existing service has multiple versions and is out in the field, so modifications to the Service itself is not desirable.
When I POST (HTTP/1.1) a <Get_Data> request, the Service will respond in one of two ways: Scenario 1: The requested data is small enough to service in the current Request/Receive cycle and I get back the values I expect in my request stream.
Scenario 2: The requested data is too large to immediately send back, and I will get N number of "Progress_Info" packages spaced about 4s apart before getting back the real payload.
When I 'WireShark' the communication with an existing C++ program that I am trying to replicate in C#, I get the following description of the interim packets:
- Content-Length: 102 \n
- HTTP response 3/4
- [Prev response in frame: 14]
- [Next response in frame: 25]
So, the real question is - how do I keep the response stream open, receive (and discard) the interim "Progress_Info" messages, until I get (and keep) the final message that contains the desired data.
This is what I have as the send/receive code:
public string Send_SOAP_Request_And_Receive_Response( string iInterface, string iRequestMessage )
{
string oResponseText = string.Empty;
try
{
HttpWebRequest request = Create_Message( MESSAGE_TYPE_POST, iInterface );
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes( iRequestMessage );
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write( bytes, 0, bytes.Length );
HttpWebResponse response = ( HttpWebResponse )request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader( responseStream );
if ( response.StatusCode == HttpStatusCode.OK )
{
oResponseText = reader.ReadToEnd();
// MessageBox.Show( oResponseText );
}
// *NEED CODE TO CONTINUE READING THE STREAM UNTIL REAL MESSAGE IS SENT* //
requestStream.Close();
}
catch (Exception ex)
{
Global.Display_Message( ex.Message );
}
return oResponseText;
}