- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在从客户端方法 getRecords 调用 ReadToEnd 方法期间,我收到一个对象处置异常,该方法使用 StreamReader 与网络服务器通信。
第一次调用 getRecords 成功,只是在后续调用期间发生异常,因此我没有正确关闭和处理 StreamReader 和关联的 WebRequest。
我知道我可以将这两个对象包装在一个 using 语句中,但是它只是扩展为一个 try/catch/finally 语句。从下面的代码中可以看出,我正在清理 finally 子句。
因此,我要么没有做 using 语句所做的事情,要么我的 finally 语句中可能缺少其他东西。如果在一切皆有可能,因为我喜欢我的代码明确。
这是代码和相关的异常:
public int getRecords(string[] args, string[] vals)
{
List<string> urlList = BuildUrlRequestStrings(args, vals);
WebRequest request = null;
WebResponse wresponse = null;
StreamReader sr = null;
foreach (string url in urlList)
{
request = WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
//request.Timeout = -1;
request.Timeout = 300000;
request.Credentials = CredentialCache.DefaultCredentials;
//request.ContentType = "application/xml";
try
{
wresponse = request.GetResponse();
/*using (StreamReader sr = new StreamReader(wresponse.GetResponseStream()))
{
_recieveBuffer = sr.ReadToEnd().ToString();
}*/
sr = new StreamReader(wresponse.GetResponseStream());
_recieveBuffer = sr.ReadToEnd();
//List<T> temp = JsonConvert.DeserializeObject<List<T>>(_recieveBuffer);
List<T> temp = JsonConvert.DeserializeObject<List<T>>(
_recieveBuffer,
new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
);
_recieveData.AddRange(temp);
}
catch (WebException ex)
{
if (ex.Response != null)
{
// can use ex.Response.Status, .StatusDescription
if (ex.Response.ContentLength != 0)
{
using (var stream = ex.Response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
Log.Info(FIDB.TAG1, " WSBuffer.getRecords: WEBSERVER MESSAGE: " + reader.ReadToEnd());
}
}
}
}
return -1;
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
if (wresponse != null)
{
wresponse.Close();
wresponse.Dispose();
}
}
}
return _recieveData.Count;
}
07-02 11:32:15.076: I/<<< FI >>>(2775): StorageRelayService.RequestQueueThread: EXCEPTION: System.ObjectDisposedException: The object was used after being disposed. 07-02 11:32:15.076: I/<<< FI >>>(2775): at System.Net.WebConnection.BeginRead (System.Net.HttpWebRequest request, System.Byte[] buffer, Int32 offset, Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at System.Net.WebConnectionStream.BeginRead (System.Byte[] buffer, Int32 offset, Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI
(2775): at System.Net.WebConnectionStream.Read (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at System.IO.StreamReader.ReadBuffer () [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at System.IO.StreamReader.Read (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI (2775): at System.IO.StreamReader.ReadToEnd () [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at FieldInspection.Shared.Buffer.WSBuffer
1[FieldInspection.Shared.Model.AggregateRoot.Parcel].getRecords
1[FieldInspection.Shared.Model.AggregateRoot.Parcel].Read (IConditions conditions) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at FieldInspection.Shared.Model.DataAccess.ParcelRepositoryREST.parcelByIdList (System.Collections.Generic.List
(System.String[] args, System.String[] vals) [0x00000] in <filename
unknown>:0 07-02 11:32:15.076: I/<<< FI >>>(2775): at
FieldInspection.Shared.Repository.REST.RepositoryREST1 parcelIdList, Boolean bCurrent,
1 reqList) [0x00000] in :0 07-02 11:32:15.076: I/<<< FI >>>(2775): at FieldInspection.Droid.StorageRelayService.RequestQueueThread () [0x00000] in :0
Boolean bHistorical) [0x00000] in <filename unknown>:0 07-02
11:32:15.076: I/<<< FI >>>(2775): at
FieldInspection.Droid.StorageRelayService.ProcessRequestGetParcelCache
(FieldInspection.Shared.Database.IPC.Request request) [0x00000] in
<filename unknown>:0 07-02 11:32:15.076: I/<<< FI >>>(2775): at
FieldInspection.Droid.StorageRelayService.ProcessRequestFromForegroundActivity
(System.Collections.Generic.List
最佳答案
我强烈建议您使用“using”语句。一旦您知道您的 WebResponse 和 StreamReader 已正确部署,调试就会变得更加容易。
此外,您为循环的每次迭代创建一个 WebRequest 对象。为什么不尝试异步方法?
关于c# - 正确处理 WebRequest 和 StreamReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023811/
文档只是说 ReadBlock 是 “Read 的阻塞版本” 但这意味着什么? 之前有人问过这个问题,嗯? http://www.pcreview.co.uk/forums/thread-138578
我对 StreamReader 类的两个不同构造函数有点困惑,即 1.StreamReader(流) 我知道它需要流字节作为输入,但相应的输出是相同的。 这是我使用 StreamReader(Stre
我试图从一个文本文件中读取,该文本文件在写入时有多个输出,但是当我想从我已经输出内容的文本文件中读取时,我想选择最后一个条目(记住每个条目当写作有 5 行时,我只想要包含“密文:”)的行 但是它正在读
我正在开发一个接受TCP连接并读取数据的应用程序,直到读取标记,然后将该数据写入文件系统。我不想断开连接,我想让客户端发送数据来做到这一点,以便他们可以在一个连接中发送多个文件。 我在外部循环中使用了
我尝试制作一个脚本,该脚本可以逐行读取 TXT 文件,并根据里面的内容更改标签。有没有办法检查正在读取哪一行? 最佳答案 此示例使用 StreamReader 类的 ReadLine 方法将文本文件的
我正在尝试处理文本文件的一部分,并使用 UploadFromStream 将文本文件的其余部分写入云 blob。问题在于 StreamReader 似乎从底层流中获取了太多内容,因此后续写入不会执行任
某处是否有非缓冲流读取器实现? 我通过以下方式创建了我的流 FileInputStream inputStream = new FileInputStream(inputFilename); Coun
我想要一个 string[]分配了一个 StreamReader .喜欢: try{ StreamReader sr = new StreamReader("a.txt"); do{
我想弄清楚如何标记文本文件的 StreamReader。我已经能够将这些行分开,但现在我正试图弄清楚如何通过制表符分隔符来分解这些行。这是我目前所拥有的。 string readContents; u
我正在使用我编写的一些不是最佳的代码...:-| 我有以下代码: string fmtLine = ""; string[] splitedFmtLine;
我正在尝试从我的 Web 应用程序的 App_Data 文件夹加载文件: KezMenu kmenu = new KezMenu("~/App_Data/Menu.xml"); 但出于某种原因,这
我正在尝试使用接收 FileStream 的 StreamReader 读取文件的内容。该文件内部有一些空格(字符 32),StreamReader 将它们读取为 0(字符 48)。屏幕截图显示了 F
我有一些奇怪的问题(对我来说)。 有一个应用程序是 Windows 窗体应用程序“firstapp.exe”。还有另一个应用程序也是 Windows 窗体应用程序“launcher.exe”。并且有一
我需要在 C# 应用程序上同时逐行读取四个非常大 (>2 Gb) 的文件。我使用了四种不同的 StreamReader 对象及其 ReadLine() 方法。 同时从四个文件中读取行时,性能会受到严重
我有一个包装在 System.IO.StreamReader 中的输入流...我希望将流的内容写入文件(即 StreamWriter)。 输入流的长度未知。长度可以是几个字节,也可以是千兆字节。 怎么
我对这篇文章有类似的要求... Populate Gridview at runtime using textfile 我想用 StreamReader 读取文本文件并用文件中的数据填充 DataTa
我应该使用哪种编码来读取 æ、Ø、å、ä、ö、ü 等? 最佳答案 您应该使用原始数据的任何编码。你从哪里获取数据,你有关于它的编码的信息吗?如果您尝试使用错误的编码来读取它,您将得到错误的答案:即使您
你好,我在为 Unity3D 编写编辑器时遇到了问题,我遇到了一个问题,我正在从具有常规字符串的 .txt 文件中读取行,然后在每个常规字符串下方读取文件扩展名(代表扩展名的类别) ).当我尝试在分配
这是我的代码: StreamReader reader = new StreamReader("war.txt"); string input = null; while ((input = read
我正在制作一个函数,它将从 StreamReader 中获取行数,不包括注释(以“//”开头的行)和新行。 这是我的代码: private int GetPatchCount(StreamReader
我是一名优秀的程序员,十分优秀!