2010-10-19 67 views
1

这个问题让我难堪。在过去的12个月里,我们在生产服务器上发生了三次这样的事情,并在出现重大问题时发生。任何帮助,将不胜感激。System.Net.WebRequest - TCP连接重用/缓存?

我们有一个.NET Windows服务向第三方服务器发送HTTP请求。发生“某些事情”,并且接下来的2-3个请求会因服务器错误503而失败,随后的请求会收到超时异常。听起来像一个服务器问题吗?但是,如果我在浏览器中输入请求URL,它将返回响应。

该问题已通过重新启动.NET服务解决,现在让我认为这是一个客户端问题,但我无法想象如何。到服务器的底层TCP连接是否被重用或缓存?有没有一种方法可以强制.NET重新创建连接?

以下是网络请求代码。

public string GetResponseFromServer(string requestXML, string serverUrl, int Timeout) 
{ 
    System.Net.WebRequest req = System.Net.WebRequest.Create(serverUrl); 
    req.Method = "POST"; 
    req.Timeout = Timeout; 

    byte[] requestBodyBytes = System.Text.Encoding.UTF8.GetBytes(requestXML); 

    req.ContentLength = requestBodyBytes.Length; 

    Stream newStream = req.GetRequestStream(); 
    newStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 
    newStream.Close(); 

    System.Net.WebResponse response = req.GetResponse(); 

    StreamReader reader = new StreamReader(response.GetResponseStream()); 
    return reader.ReadToEnd(); 
} 

回答

1

错误可能与资源泄漏有关。 response,readerresponse.GetResponseStream()返回的流都没有被处置。将这些资源包装在using声明中以确保它们全部得到妥善处理:

using (Stream newStream = req.GetRequestStream()) 
{ 
    newStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 
} 

using (System.Net.WebResponse response = req.GetResponse()) 
{ 
    using (Stream responseStream = response.GetResponseStream()) 
    { 
    using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     return reader.ReadToEnd(); 
    } 
    } 
} 
+1

谢谢克里斯我会试试看。 – 2010-10-19 22:47:07