He escrito un código para enviar y leer texto de un oyente. Esto funciona bien en el primer y segundo intercambio, pero en el tercer envío hay una larga demora entre llamar a GetRequestStream y la escritura real de los datos.HttpWebRequest getRequestStream se cuelga en varias ejecuciones
he dispuesto el outStream en el lado de envío, así como el lector corriente, y la corriente de entrada en el lado de lectura como se recomienda aquí: Does anyone know why I receive an HttpWebRequest Timeout?
y todavía cuelga en el 3er intento de enviar información Definitivamente parece estar colgando en GetRequestStrean en sendMessage:
public void sendMessage(string message)
{
HttpWebRequest request;
string sendUrl;
sendUrl = "http://" + termIPAddress + ":" + sendPort + "/";
Uri uri = new Uri(sendUrl);
Console.WriteLine("http://" + termIPAddress + ":" + sendPort + "/");
ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
servicePoint.ConnectionLeaseTimeout = 300;
request = (HttpWebRequest)WebRequest.Create(sendUrl);
request.KeepAlive = false;
request.Method = "POST";
request.ProtocolVersion = HttpVersion.Version11;
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("SourceIP", localIPAddress);
request.Headers.Add("MachineName", localName);
requestStarted = true;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message);
request.ContentLength = buffer.Length;
try
{
using (Stream output = request.GetRequestStream())
{
output.Write(buffer, 0, buffer.Length);
output.Close();
request = null;
}
}
catch(WebException wE)
{
Console.WriteLine(wE.Message);
}
}
Y esta es la parte de lectura:
public string getMessage()
{
Console.WriteLine("Entering actual listener");
string s;
string sourceIP;
NameValueCollection headerList;
HttpListenerContext context = terminalListener.GetContext();
HttpListenerRequest request = context.Request;
headerList = request.Headers;
sourceIP = headerList.GetValues("SourceIP")[0];
termName = headerList.GetValues("MachineName")[0];
termIPAddress = sourceIP;
using (System.IO.Stream body = request.InputStream)
{
System.Text.Encoding encoding = request.ContentEncoding;
using (System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding))
{
s = reader.ReadToEnd();
body.Close();
reader.Close();
}
}
return termName + " : " + s;
}
También probé para añadir un aprieto IP de punto final, pero tienen que ser honesta, Don No entiendo completamente esta parte del código:
private IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
int portNumber = Convert.ToInt32(sendPort);
IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(localIPAddress), 0);
Console.WriteLine(Convert.ToString(IEP));
return IEP;
}
Cualquier ayuda muy apreciada.
Genial. Arreglado. Muchas gracias. – user1731572
También debe. Desechar() la respuesta, tuvimos código similar y no descartar que la respuesta estuviera causando bloqueos en el mismo método. –