HTTP底层流Web请求实时读写方案及代码示例需求
底层流实时读写的Web请求(PUT)完整实现
针对你需要的Web请求场景下底层流实时读写的需求,我把你提供的代码片段补全并优化成完整可运行的F#实现,重点保证流的实时操作和资源安全:
open System open System.Net open System.Text open System.IO let sendPutRequestWithStream (url: string) (schema: string) = async { // 创建HTTP PUT请求实例,用use自动释放资源 use request = WebRequest.CreateHttp(url) request.Method <- "PUT" request.ContentType <- "application/json; charset=utf-8" // 按需调整内容类型 // 异步获取请求流,use关键字会自动处理流的释放 use! requestStream = request.GetRequestStreamAsync() |> Async.AwaitTask // 模拟实时分块写入流(适合大体积数据,避免一次性加载到内存) let schemaBytes = Encoding.UTF8.GetBytes(schema) let chunkSize = 1024 // 可根据实际场景调整块大小 let mutable bytesWritten = 0 while bytesWritten < schemaBytes.Length do let remainingBytes = schemaBytes.Length - bytesWritten let currentWriteSize = Math.Min(chunkSize, remainingBytes) // 异步写入当前块 do! requestStream.WriteAsync(schemaBytes, bytesWritten, currentWriteSize) |> Async.AwaitTask bytesWritten <- bytesWritten + currentWriteSize printfn $"已实时写入 {bytesWritten}/{schemaBytes.Length} 字节" // 实时进度提示 // 发送请求并异步获取响应 use! response = request.AsyncGetResponse() use responseStream = response.GetResponseStream() use streamReader = new StreamReader(responseStream, Encoding.UTF8) // 实时分块读取响应流内容 let mutable responseContent = "" let charBuffer = Array.zeroCreate<char> 1024 let mutable charsRead = 0 do! async { charsRead <- streamReader.Read(charBuffer, 0, charBuffer.Length) while charsRead > 0 do responseContent <- responseContent + new string(charBuffer, 0, charsRead) printfn $"已实时读取响应 {charsRead} 字符" // 实时读取进度 charsRead <- streamReader.Read(charBuffer, 0, charBuffer.Length) } // 返回响应内容和状态码 return responseContent, (response :?> HttpWebResponse).StatusCode } // 调用示例 let testApiUrl = "https://example.com/api/resource" let testPayload = """{"id": 123, "content": "stream-based data"}""" async { let! responseContent, status = sendPutRequestWithStream testApiUrl testPayload printfn $"请求完成,状态码: {status}" printfn $"响应内容:\n{responseContent}" } |> Async.RunSynchronously
核心细节说明:
- 资源自动管理:全程用
use关键字托管请求、流、读取器等资源,无需手动调用Close或Dispose,避免资源泄漏 - 实时流操作:通过分块写入/读取的方式,模拟数据实时传入的场景,尤其适合处理大文件或大体积数据,减少内存占用
- 异步非阻塞:所有IO操作都用异步方法封装,避免阻塞主线程,提升应用的并发性能
- 灵活适配:可根据实际传输的数据类型调整
ContentType,分块大小也可按需修改
内容的提问来源于stack exchange,提问作者Developer11
相关产品推荐
相关产品推荐

