.net 重置流读卡器F#

.net 重置流读卡器F#,.net,f#,streamreader,.net,F#,Streamreader,我使用以下方法从GET请求下载数据: let fetchUrl callback url = let req = WebRequest.Create(Uri(url)) req.Method <- "GET" use resp = req.GetResponse() use stream = resp.GetResponseStream() use reader = new IO.StreamReader(stream)

我使用以下方法从GET请求下载数据:

let fetchUrl callback url =      
    let req = WebRequest.Create(Uri(url)) 
    req.Method <- "GET"
    use resp = req.GetResponse() 
    use stream = resp.GetResponseStream() 
    use reader = new IO.StreamReader(stream) 
    callback reader url
这在我第一次使用它时效果很好,但是第二次,它在线路上崩溃了:

let html = reader.ReadToEnd()
除此之外:

Cannot read from a closed TextReader.
我试着做:

reader.BaseStream.Position <- (0 |> int64)
reader.DiscardBufferedData()
reader.BaseStream.Position int64)
reader.discardeBufferedData()
但是,这也不起作用,会引发异常:

Cannot read from a closed TextReader.
不支持指定的方法。


在试图重置基流位置的线路上

设置流的位置并不总是可能的。在这种特殊情况下,您的流来自网络,一旦您读入,除了要求远程发送器重复传输之外,没有其他方法“重复”该过程。数据不是“存储”在磁盘或类似的地方,而是在您读取数据时从网络中输入的

我建议您更改应用程序体系结构,以便它将数据存储在中间缓冲区中,以防需要多次读取,例如:

let fetchUrl callback url =      
    let req = WebRequest.Create(Uri(url)) 
    req.Method <- "GET"
    use resp = req.GetResponse() 
    use stream = resp.GetResponseStream() 
    let text = new IO.StreamReader(stream).ReadToEnd()
    callback (fun () -> new StringReader(text)) url

let myCallbackGetListings (getReader : unit -> TextReader) url (chatMatch : ChatMatch) = 
    let html = getReader().ReadToEnd()
let fetchUrl callback url =      
    ...
    let text = new IO.StreamReader(stream).ReadToEnd()
    callback text url

let myCallbackGetListings text url (chatMatch : ChatMatch) = 
    let html = text