Http 从WebResponse响应流读取响应
我一直在F#交互式会话中处理一些基本的HTTP请求-响应操作,试图更好地理解这种语言。这里的一切似乎都按预期工作,除了当我得到HTTP请求的响应流时,我似乎永远无法从中读取任何内容。在下面的代码中,我每次都从printfn行获取文本,但是Http 从WebResponse响应流读取响应,http,f#,stream,Http,F#,Stream,我一直在F#交互式会话中处理一些基本的HTTP请求-响应操作,试图更好地理解这种语言。这里的一切似乎都按预期工作,除了当我得到HTTP请求的响应流时,我似乎永远无法从中读取任何内容。在下面的代码中,我每次都从printfn行获取文本,但是responseString的值似乎总是空的。我遗漏了什么明显的东西吗 let httpListener = new HttpListener() httpListener.Prefixes.Add("http://*:8020/") let getConte
responseString
的值似乎总是空的。我遗漏了什么明显的东西吗
let httpListener = new HttpListener()
httpListener.Prefixes.Add("http://*:8020/")
let getContext = Async.FromBeginEnd(httpListener.BeginGetContext, httpListener.EndGetContext)
let processRequest = async {
while true do
let! context = getContext
let request = context.Request
use requestReader = new StreamReader(request.InputStream)
let requestString = requestReader.ReadToEnd()
let response = context.Response
use streamWriter = new StreamWriter(response.OutputStream)
streamWriter.WriteLine "A response!"
response.Close()
}
httpListener.Start()
let maxThreads = 10
for n = 0 to maxThreads do
Async.Start processRequest
printfn "HttpListener started with %d maximum threads processing requests." maxThreads
let sendRequest = async {
let request = WebRequest.Create("http://localhost:8020") :?> HttpWebRequest
let postBytes = Encoding.ASCII.GetBytes("Issuing HTTP")
request.Method <- "POST"
request.ContentType <- "application/x-www-form-urlencoded"
request.ContentLength <- int64 postBytes.Length
let requestStream = request.GetRequestStream()
requestStream.Write(postBytes, 0, postBytes.Length)
requestStream.Close()
let! response = Async.FromBeginEnd(request.BeginGetResponse, request.EndGetResponse)
let responseStream = response.GetResponseStream()
use streamReader = new StreamReader(responseStream)
let responseString = streamReader.ReadToEnd()
printfn "Received the following response: %s" responseString
}
for n = 0 to maxThreads do
Async.Start sendRequest
让httpListener=newhttplistener()
httpListener.Prefixes.Add(“http://*:8020/”)
让getContext=Async.FromBeginEnd(httpListener.BeginGetContext,httpListener.EndGetContext)
让processRequest=async{
尽管如此
让!context=getContext
let request=context.request
使用requestReader=newstreamreader(request.InputStream)
让requestString=requestReader.ReadToEnd()
让response=context.response
使用streamWriter=newstreamwriter(response.OutputStream)
streamWriter.WriteLine“响应!”
答复:Close()
}
httpListener.Start()
设maxThreads=10
对于n=0到maxThreads do
Async.Start processRequest
printfn“HttpListener启动时处理请求的线程数最多为%d个。”maxThreads
让sendRequest=async{
let request=WebRequest.Create(“http://localhost:8020“”:?>HttpWebRequest
让postBytes=Encoding.ASCII.GetBytes(“发出HTTP”)
request.Method您需要减少StreamWriter的使用范围,以便在Dispose时刷新它
let processRequest = async {
while true do
let! context = getContext
let request = context.Request
use requestReader = new StreamReader(request.InputStream)
let requestString = requestReader.ReadToEnd()
let response = context.Response
do
use streamWriter = new StreamWriter(response.OutputStream)
streamWriter.WriteLine "A response!"
response.Close()
}
您需要减少StreamWriter的使用范围,以便在Dispose上刷新它
let processRequest = async {
while true do
let! context = getContext
let request = context.Request
use requestReader = new StreamReader(request.InputStream)
let requestString = requestReader.ReadToEnd()
let response = context.Response
do
use streamWriter = new StreamWriter(response.OutputStream)
streamWriter.WriteLine "A response!"
response.Close()
}
太棒了,谢谢!只是想澄清一下,您是在谈论消费using块时发生的dispose?还是在response.Close()时发生的dispose?我习惯于使用{}来定义块的作用域在C#中,能够在一行中定义一个的想法让我感到困惑。为什么我能够从InputStream中获取requestString,而不需要像您所示的那样对其进行范围限定呢?use
绑定在一行中声明,但在包含块结束之前一直保持在范围内,在您的例子中是pProcessRequest
函数,或者在本例中是do
块。您也可以使用括号和using
来缩小作用域。非常感谢!只是想弄清楚,您是在谈论使用using块时发生的dispose?还是在响应时发生的dispose。Close()?我习惯于使用{}来定义作用域的块在C#中,能够在一行中定义一个的想法让我感到困惑。为什么我能够从InputStream中获取requestString,而不需要像您所示的那样对其进行范围限定呢?use
绑定在一行中声明,但在包含块结束之前一直保持在范围内,在您的例子中是p处理请求
函数,或者在本例中为do
块。您也可以使用括号和使用
来缩小范围。