StreamReaderを使用してWebサーバーと通信するクライアント側のメソッドgetRecordsからReadToEndメソッドを呼び出しているときに、オブジェクトが破棄された例外が発生します。
getRecordsへの最初の呼び出しは成功し、その後の呼び出し中にのみ例外が発生するため、StreamReaderと関連するWebRequestを適切に閉じて破棄していません。
これらの2つのオブジェクトをusingステートメントでラップできることは承知していますが、それはtry / catch/finallyステートメントに展開されるだけです。以下のコードでわかるように、finally句でクリーンアップしています。
したがって、私はusingステートメントが行うことを行っていないか、finallyステートメントに欠けている可能性のある他の何かがあります。私は自分のコードが明示的であることが好きなので、可能な限りusingステートメントを使用したくありません。
コードと関連する例外は次のとおりです。
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:オブジェクトは破棄された後に使用されました。07-02 11:32:15.076:I / <<< FI >>>(2775):System.Net.WebConnection.BeginRead(System.Net.HttpWebRequestリクエスト、System.Byte []バッファー、Int32オフセット、Int32サイズ、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 []バッファー、Int32オフセット、Int32サイズ、System.AsyncCallback cb、System.Object状態)[0x00000] in:0 07-02 11:32:15.076:I / <<< FI
(2775):System.Net.WebConnectionStream.Read(System.Byte []バッファー、Int32オフセット、Int32サイズ)[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 []バッファー、Int32インデックス、Int32カウント)[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 (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.RepositoryREST
1 [FieldInspection.Shared.Model.AggregateRoot.Parcel] .Read(IConditions condition)[0x00000] in:0 07-02 11:32:15.076:I / <<< FI >>>(2775):at FieldInspection.Shared .Model.DataAccess.ParcelRepositoryREST.parcelByIdList(System.Collections.Generic.List1 parcelIdList, Boolean bCurrent, 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
1 reqList)[0x00000] in:0 07-02 11:32:15.076:I / <<< FI >>>(2775):FieldInspectionで。 Droid.StorageRelayService.RequestQueueThread()[0x00000] in:0