Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 从WebResponse响应流读取响应_Http_F#_Stream - Fatal编程技术网

Http 从WebResponse响应流读取响应

Http 从WebResponse响应流读取响应,http,f#,stream,Http,F#,Stream,我一直在F#交互式会话中处理一些基本的HTTP请求-响应操作,试图更好地理解这种语言。这里的一切似乎都按预期工作,除了当我得到HTTP请求的响应流时,我似乎永远无法从中读取任何内容。在下面的代码中,我每次都从printfn行获取文本,但是responseString的值似乎总是空的。我遗漏了什么明显的东西吗 let httpListener = new HttpListener() httpListener.Prefixes.Add("http://*:8020/") let getConte

我一直在F#交互式会话中处理一些基本的HTTP请求-响应操作,试图更好地理解这种语言。这里的一切似乎都按预期工作,除了当我得到HTTP请求的响应流时,我似乎永远无法从中读取任何内容。在下面的代码中,我每次都从printfn行获取文本,但是
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
块。您也可以使用括号和
使用
来缩小范围。