1

私は、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
4

1 に答える 1

1

Dispose でフラッシュできるように、StreamWriter の使用範囲を縮小する必要があります。

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()
}
于 2013-07-31T04:36:44.253 に答える