Stream FeedReader(string url_)
{
var url = url_;
var USER = "username";
var PASS = "password";
//var encoded = TextToBase64(USER + ":" + PASS);
WebRequest myWebRequest = WebRequest.Create(url);
// myWebRequest.Method = "POST";
//myWebRequest.ContentType = "application/x-www-form-urlencoded";
myWebRequest.PreAuthenticate = true;
myWebRequest.Credentials = new NetworkCredential(USER, PASS);
myWebRequest.Timeout = 10000;
//WebResponse response = myWebRequest.GetResponse();
var stream = myWebRequest.GetResponse().GetResponseStream() ;
return stream;
}
我不知道为什么在调用此函数后我总是遇到错误(连接超时),我希望有人可以提供帮助。请不要犹豫,非常感谢你......
public static List<Item> ParseAtom2(Stream stream)
{
XDocument doc = XDocument.Load(stream);//("atom.xml");
XNamespace ns = "http://www.w3.org/2005/Atom";
var entries = doc.Root
.Descendants(ns + "entry")
.Select(item => new Item
{
FeedType = FeedType.Atom,
Content = item.Element(ns + "content").Value,
Link = "",//(string)item.Element(ns + "link").Attribute("href").Value,
PublishDate = DateTime.Parse(item.Element(ns + "published").Value),
Title = item.Element(ns + "title").Value
});
stream.Close();
return entries.ToList();
}
这是我使用从第一个返回的流作为参数的第二个函数。而且我总是遇到超时连接错误。
答案 0 :(得分:2)
我的猜测是你没有关闭流,希望关闭响应。 (您通常会明确地处理响应。)我至少会考虑在此方法中创建流的副本。在.NET 4中很容易:
using (var response = myWebRequest.GetResponse())
{
MemoryStream copy = new MemoryStream();
using (var responseStream = response.GetResponseStream())
{
responseStream.CopyTo(copy);
}
copy.Position = 0;
return copy;
}
如果您没有正确处理资源,连接池会认为您仍在使用该连接,并且每个主机的连接数有限制。
(假设我是对的,你不是在其他地方关闭流,你也应该这样做 - 一般来说,确保你总是关闭你的资源。)