如何适配RestSharp新版本的AdvancedResponseWriter新签名
适配RestSharp新版本AdvancedResponseWriter的代码修改方案
下面是适配新签名后的完整代码:
string fileName = ...; Uri url = ...; var restRequest = new RestRequest { Method = Method.Get, AdvancedResponseWriter = async (message, request, restResponse) => { // 从HttpResponseMessage中获取ContentType var contentType = message.Content.Headers.ContentType?.MediaType; if (string.IsNullOrEmpty(contentType) || contentType.Equals(OctetStreamContentType, StringComparison.OrdinalIgnoreCase)) { contentType = MimeTypes.GetMimeType(GetFileName(fileName, url, OctetStreamContentType)); } filePath = this.fileSystem.Path.Combine(this.fileSystem.Path.GetTempPath(), $"{connectorId}", GetFileName(fileName, url, contentType)); this.fileSystem.Directory.CreateDirectory(this.fileSystem.Path.GetDirectoryName(filePath)); var copySuccess = false; // 从响应内容中获取流 using (var dataStream = await message.Content.ReadAsStreamAsync()) using (var file = this.fileSystem.File.OpenWrite(filePath)) { // 若CopyToWithLimit有异步版本则用await调用,同步版本直接调用即可 copySuccess = await dataStream.CopyToWithLimitAsync(file, sizeLimit); // 同步版本写法:copySuccess = dataStream.CopyToWithLimit(file, sizeLimit); } if (!copySuccess) { ... } }, } .AddHeader(AcceptHeader, AcceptHeaderValue);
关键改动说明:
- 签名适配:将委托参数替换为新版本要求的
(HttpResponseMessage message, RestRequest request, RestResponse restResponse),同时因涉及异步流操作,给委托添加async关键字。 - 流获取逻辑:不再直接接收Stream参数,改为通过
message.Content.ReadAsStreamAsync()异步获取响应流,用using块保证流资源正确释放。 - ContentType来源:从
message.Content.Headers.ContentType?.MediaType读取响应的Content-Type,替代原有的http.ContentType。 - 异步处理:优先使用异步版本的流复制方法并配合
await;若只有同步版本,直接调用即可,但需确保响应流已通过异步方式读取完成。
内容的提问来源于stack exchange,提问作者user1178399
相关产品推荐
相关产品推荐

