2012-10-09 4 views
11

リスナーからテキストを送信および読み込むコードを記述しました。これは1回目と2回目の交換で正常に動作しますが、3回目の送信では、GetRequestStreamを呼び出すとデータの実際の書き込みの間に長い遅延があります。HttpWebRequest getRequestStreamが複数の実行でハングする

ここで推奨されているように私は、送信側のOUTSTREAMと同様に、ストリームリーダー、リード側の入力ストリームを配置されました:

Does anyone know why I receive an HttpWebRequest Timeout?

、それはまだ送信するための第三の試みでハング情報私はドン、私はまた、IPエンドポイントのバインドを追加しますが、正直でなければならないことを試みた

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;  
} 

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); 
    } 
} 

そして、これは、読み取り部分である:間違いのsendMessageにGetRequestStreanでぶら下がっているように見えます

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; 
} 

ご迷惑をおかけして申し訳ございません。

答えて

10

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

+2

修正しました。どうもありがとう。 – user1731572

+1

また、応答を.Dispose()する必要があります。私たちは同様のコードを持っていました。応答を破棄しても、同じメソッドでハングアップが発生していませんでした。 –

関連する問題