【问题】
测试一个C#,结果其中这部分代码:
// valid charset:"GB18030"/"UTF-8", invliad:"UTF8"
public string getUrlRespHtml(string url,
Dictionary<string, string> headerDict,
string charset,
Dictionary<string, string> postDict,
int timeout,
string postDataStr)
{
string respHtml = "";
//HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout);
HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout, postDataStr);
//long realRespLen = resp.ContentLength;
if (resp != null)
{
StreamReader sr;
if ((charset != null) && (charset != ""))
{
Encoding htmlEncoding = Encoding.GetEncoding(charset);
sr = new StreamReader(resp.GetResponseStream(), htmlEncoding);
}
else
{
sr = new StreamReader(resp.GetResponseStream());
}
//respHtml = sr.ReadToEnd();
while (!sr.EndOfStream)
{
respHtml = respHtml + sr.ReadLine();
}
sr.Close();
resp.Close();
}
return respHtml;
}中的:
respHtml = respHtml + sr.ReadLine();
出错:
未处理ObjectDisposedException 无法访问已关闭的流 |
异常的详细信息是:
未处理 System.ObjectDisposedException Source=System ObjectName="" StackTrace: 在 System.Net.GZipWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 size) 在 System.IO.StreamReader.ReadBuffer() 在 System.IO.StreamReader.ReadLine() 在 crifanLib.getUrlRespHtml(String url, Dictionary`2 headerDict, String charset, Dictionary`2 postDict, Int32 timeout, String postDataStr) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\libs\crifan\crifanLib.cs:行号 1717 在 crifanLib.getUrlRespHtml_multiTry(String url, Dictionary`2 headerDict, String charset, Dictionary`2 postDict, Int32 timeout, String postDataStr, Int32 maxTryNum) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\libs\crifan\crifanLib.cs:行号 1741 在 crifanLibAmazon.extractAllSingleTypeSellerInfo(String singleTypeUrl) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\libs\crifan\crifanLibAmazon.cs:行号 1142 在 crifanLibAmazon.extractAllSellerInfo(String usedAndNewUrl, List`1& allSellerInfoList) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\libs\crifan\crifanLibAmazon.cs:行号 1266 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.awsGetAllProductInfo(String itemAsin, awsItemAttributes itemAttributes) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2659 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.awsFindAndSaveItem(String itemAsin, awsItemAttributes itemAttributes) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2401 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.processAmazonItem(String itemAsin) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2385 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.processAwsSearchItem(awsSearchResultItem singleAwsSearchItem) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2188 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.searchSingleBrowseNodeId(String curBrowseNodeId, String curSearchIndex, String curFullCategoryName) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2028 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.doSearchForAllChildOfSingleTreeNode(TreeNode curTreeNode) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2107 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.doSearchForAllChildOfSingleTreeNode(TreeNode curTreeNode) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2098 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.doSearchForAllChildOfSingleTreeNode(TreeNode curTreeNode) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2098 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.awsCategorySearch() 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 2143 在 ScrapeAmazonProduct.frmScrapeAmazonProduct.btnSearch_Click(Object sender, EventArgs e) 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\frmScrapeAmazonProduct.cs:行号 1590 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 在 System.Windows.Forms.Application.Run(Form mainForm) 在 ScrapeAmazonProduct.Program.Main() 位置 E:\Dev_Root\freelance\Elance\projects\40939187_scrape_amazon\40939187_scrape_amazon\ScrapeAmazonProduct\ScrapeAmazonProduct\Program.cs:行号 17 在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart() InnerException: |
【解决过程】
1.很明显,代码里面,是先处理StreamReader处理完之后,才会去close的。
但是此处竟然会出现“无法访问已关闭的流”之类的错误,很是匪夷所思。
2.之前也没出现过类似的错误。
3.再去看了看,结果是:
EndOfStream引发了System.ObjectDisposedException类型的异常
4.此人:
C# ftp download and stream to XML error
说是自己加上了keepalive就可以了。
但是我之前的代码,一直是:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.AllowAutoRedirect = true;
req.Accept = "*/*";
//req.ContentType = "text/plain";
//const string gAcceptLanguage = "en-US"; // zh-CN/en-US
//req.Headers["Accept-Language"] = gAcceptLanguage;
req.KeepAlive = true;的,并且这部分代码,也运行了成千上万次了,一直没出现这样的错误。
不知道此处,为何出错。
5.猜测是:
此时,特定的url:
| http://www.amazon.com/gp/offer-listing/B004W8Z3IK/sr=/qid=/ref=olp_page_next?ie=UTF8&colid=&coliid=&condition=new&me=&qid=&shipPromoFilter=0&sort=sip&sr=&startIndex=10 |
请求amazon服务器的时候,估计其虽然接收到了keepalive为true,但是不知道何种原因导致其关闭了。
所以后来再去EndOfStream,就异常了。
6.但是,还是参考:
去改动代码为:
// valid charset:"GB18030"/"UTF-8", invliad:"UTF8"
public string getUrlRespHtml(string url,
Dictionary<string, string> headerDict,
string charset,
Dictionary<string, string> postDict,
int timeout,
string postDataStr)
{
string respHtml = "";
//HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout);
HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout, postDataStr);
//long realRespLen = resp.ContentLength;
if (resp != null)
{
StreamReader sr;
Stream respStream = resp.GetResponseStream();
if ((charset != null) && (charset != ""))
{
Encoding htmlEncoding = Encoding.GetEncoding(charset);
sr = new StreamReader(respStream, htmlEncoding);
}
else
{
sr = new StreamReader(respStream);
}
try
{
//respHtml = sr.ReadToEnd();
while (!sr.EndOfStream)
{
respHtml = respHtml + sr.ReadLine();
}
respStream.Close();
sr.Close();
resp.Close();
}
catch (Exception ex)
{
//【未解决】C#中StreamReader中遇到异常:未处理ObjectDisposedException,无法访问已关闭的流
//https://www.crifan.org/csharp_streamreader_unhandled_exception_objectdisposedexception_cannot_access_closed_stream
//System.ObjectDisposedException
respHtml = "";
}
}
return respHtml;
}希望对以后有效果。
至少当异常的时候,代码还能继续跑。。。
【总结】
至此,还是没有完全搞懂错误的根本原因。
转载请注明:在路上 » 【未解决】C#中StreamReader中遇到异常:未处理ObjectDisposedException,无法访问已关闭的流