2013-02-05 46 views
0

我有以下的方法,該方法返回一個XmlReader通過處置方法返回一個XmlReader底層的MemoryStream

public XmlReader RequestXML(string endpoint) 
{ 
    using (WebClient request = this.PrepareRequest(RestMethod.GET, null)) 
    { 
     byte[] response = request.DownloadData(this.RestUrl + endpoint); 
     using (MemoryStream responseStream = new MemoryStream(response)) 
     { 
      XmlReader xReader = XmlReader.Create(responseStream); 
      return xReader; 
     } 
    } 
} 

但是,當然,這並不工作,因爲MemoryStream關閉調用的代碼具有前有機會使用XmlReader。是否有可能退還XmlReader並仍然處置其底層MemoryStream

我認爲接受一個代表(或Action<XmlReader>)作爲我的方法中的第二個參數來完成using中的工作,但是這種設計看起來有點尷尬。另外,I can't just call WebClient.DownloadString()

+0

爲什麼不用你在內部使用 –

+1

@Dan聲明XmlReader xReader,這沒有什麼區別。重點在於'XmlReader'在'RequestXML'之外消耗。話雖如此,'MemoryStream.Dispose()'並沒有真正做任何事情,所以海事組織的問題有點沒有實際意義。 –

回答

1

如有疑問使用XmlReaderSettings.CloseInput與此重載:XmlReader.Create(Stream, XmlReaderSettings),像這樣...

public XmlReader RequestXML(string endpoint) 
{ 
    using (WebClient request = this.PrepareRequest(RestMethod.GET, null)) 
    { 
     byte[] response = request.DownloadData(this.RestUrl + endpoint); 
     MemoryStream responseStream = new MemoryStream(response); 
     XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); 
     xmlReaderSettings.CloseInput = true; 
     return XmlReader.Create(responseStream, xmlReaderSettings); 
    } 
} 

這樣的代碼調用RequestXml不必負責MemoryStream處置。

+0

輝煌。這正是我正在尋找的。 – gilly3

相關問題