【问题标题】:This expression was expected to have type MemoryStream but here has type StreamWriter?这个表达式应该有 MemoryStream 类型,但这里有 StreamWriter 类型?
【发布时间】:2013-10-01 04:14:47
【问题描述】:

我正在尝试向 FSharp.Data 的 Http 模块 (https://github.com/fsharp/FSharp.Data/blob/master/src/Library/Http.fs) 添加一项功能,以下载和保存文件(来自 Web 响应流)。我修改了函数 asyncReadToEnd 但收到以下错误。定义函数 asyncReadToEnd 的最佳方式是什么,因此如果未提供 streamWriter,它将写入 MemoryStream

错误 1 ​​此表达式应具有类型 记忆流 但这里有类型 StreamWriter

错误行。 (Some sw

use sw = new StreamWriter(fileName)
let! response = Http.InnerRequest(url, true, ?headers=headers, ?query=query, ?meth=meth, ?body=body, ?cookies=cookies, ?cookieContainer=cookieContainer, ?certificate=certificate, ?streamWriter=Some sw)

代码sn-p:

  /// Read the contents of a stream asynchronously and return it as a string
  static let asyncReadToEnd (stream:Stream) isText streamWriter = async {
    // Allocate 4kb buffer for downloading dat
    let buffer = Array.zeroCreate (4 * 1024)
    use output = 
        match streamWriter with
        | Some (sw) -> sw
        | None -> new MemoryStream()
    let reading = ref true
    ....

  static member private InnerRequest(url:string, forceText, ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate, ?streamWriter) = async {
    ....
    return! Http.augmentWebExceptionsWithDetails <| fun () -> async {
      use! resp = Async.FromBeginEnd(req.BeginGetResponse, req.EndGetResponse)
      use stream = resp.GetResponseStream()
      let! respBody = asyncReadToEnd stream (forceText || (isText resp.ContentType)) streamWriter
      let cookies = Map.ofList [ for cookie in cookieContainer.GetCookies uri |> Seq.cast<Cookie> -> cookie.Name, cookie.Value ]  
      let headers = Map.ofList [ for header in resp.Headers.AllKeys -> header, resp.Headers.[header] ]
      let statusCode = 
        match resp with
        | :? HttpWebResponse as resp -> int resp.StatusCode
        | _ -> 0
      return { Body = respBody
               Headers = headers
               ResponseUrl = resp.ResponseUri.OriginalString
               Cookies = cookies
               StatusCode = statusCode } }
  }

  static member AsyncRequestFile(url, (fileName:string), ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate) = async {
    use sw = new StreamWriter(fileName)
    let! response = Http.InnerRequest(url, true, ?headers=headers, ?query=query, ?meth=meth, ?body=body, ?cookies=cookies, ?cookieContainer=cookieContainer, ?certificate=certificate, ?streamWriter=Some sw)
    return
        match response.Body with
        | ResponseBody.Text text -> text
        | ResponseBody.Binary binary -> failwithf "Expecting text, but got a binary response (%d bytes)" binary.Length
  }

【问题讨论】:

    标签: f# f#-3.0


    【解决方案1】:

    问题似乎在于:

    use output = 
            match streamWriter with
            | Some (sw) -> sw
            | None -> new MemoryStream()
    

    streamWriter 被推断为MemoryStream option,因此InnerRequeststreamWriter 参数也是如此。

    当您在 AsyncRequestFile 中调用它时,您传递的是 StreamReader option,因此会出现错误。

    【讨论】:

    • 我了解错误是如何发生的。如何设计代码,如果未提供streamWriter,代码将使用MemoryStream
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多