通过SDK代码下载上传的文件,返回的流缺失,导致下载出来的文件不对,下面是SDK ServiceClientImpl 类里的跟踪,读到流里大小和response.ContentLenght不一致,麻烦技术帮忙看下
protected override ServiceResponse SendCore(ServiceRequest serviceRequest,
ExecutionContext context)
{
var request = HttpFactory.CreateWebRequest(serviceRequest, Configuration);
SetRequestContent(request, serviceRequest, false, null);
try
{
var response = request.GetResponse() as HttpWebResponse;
//下面2行测试
byte[] buffer = new byte[response.ContentLength];
response.GetResponseStream().Read(buffer, 0, buffer.Length);
return new ResponseImpl(response);
}
catch (WebException ex)
{
return HandleException(ex);
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您提供的代码片段来看,问题可能出在直接使用 response.GetResponseStream().Read(buffer, 0, buffer.Length); 这一行来读取整个响应流。Stream.Read 方法并不保证会读取指定长度的数据,除非到达了流的末尾。这可能是导致实际读取到的字节数与 response.ContentLength 不一致的原因。
为了确保完整读取响应内容,您可以采用循环读取的方式直到没有更多数据可读,或者使用更现代、便捷的异步方法(如果SDK支持)。下面是一个改进后的示例代码:
protected override ServiceResponse SendCore(ServiceRequest serviceRequest,
ExecutionContext context)
{
var request = HttpFactory.CreateWebRequest(serviceRequest, Configuration);
SetRequestContent(request, serviceRequest, false, null);
try
{
var response = request.GetResponse() as HttpWebResponse;
// 使用MemoryStream来收集所有的响应内容
using (var stream = new MemoryStream())
{
response.GetResponseStream().CopyTo(stream);
byte[] buffer = stream.ToArray();
// 确保读取到的内容长度与ContentLength一致,这里仅做验证,实际应用中可能不需要此检查
if (buffer.Length != response.ContentLength)
{
// 处理长度不匹配的情况,比如记录日志或抛出异常
Console.WriteLine("Warning: Read length does not match Content-Length.");
}
return new ResponseImpl(response, buffer); // 假设ResponseImpl可以接受额外的byte[]参数
}
}
catch (WebException ex)
{
return HandleException(ex);
}
}
在这个修改后的版本中,我使用了 MemoryStream 和 CopyTo 方法来确保所有响应内容都被正确读取并存储在内存中。这样可以避免因一次性读取不完全而导致的问题。同时,根据实际情况调整了返回值假设,使其能够携带读取到的字节数据,具体实现细节需根据您的ResponseImpl类设计进行调整。