HttpWebRequest getRequestStream зависает при нескольких запусках
Я написал код для отправки и чтения текста от слушателя. Это отлично работает на 1-м и 2-м обмене, но на 3-м отправить есть длинная задержка между вызовом GetRequestStream и фактической записью данных.
я разместил outstream на стороне отправки, а также stream reader и входной поток на стороне чтения, как рекомендовано здесь : кто-нибудь знает, почему я получаю тайм-аут HttpWebRequest?
и он все еще висит на 3-я попытка отправить информацию. Он определенно, кажется, висит на GetRequestStrean в 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);
}
}
и это часть Читать :
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;
}
Я также попытался добавить привязку конечной точки IP, но, честно говоря, я не полностью понимаю эту часть кода:
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;
}
любая помощь очень ценится.
1 ответов
вы просто забыли позвонить HttpWebRequest.GetResponse
и поэтому исчерпает лимит подключений.
Итак, вы должны изменить ваш код следующим образом:
try
{
using (Stream output = request.GetRequestStream())
output.Write(buffer, 0, buffer.Length);
var response = request.GetResponse() as HttpWebResponse;
//TODO: check response.StatusCode, etc.
}
catch(WebException wE)
{
Console.WriteLine(wE.Message);
}
кроме того, в некоторых случаях вы можете изменить количество подключений по умолчанию :
ServicePointManager.DefaultConnectionLimit
или использовать постоянные соединения:
HttpWebRequest.KeepAlive