来自webrequest对象的GetResponse无法解决身份验证问题

时间:2012-02-28 08:16:28

标签: c#

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

这是我使用从第一个返回的流作为参数的第二个函数。而且我总是遇到超时连接错误。

1 个答案:

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

如果您没有正确处理资源,连接池会认为您仍在使用该连接,并且每个主机的连接数有限制。

(假设我是对的,你不是在其他地方关闭流,你也应该这样做 - 一般来说,确保你总是关闭你的资源。)