开发者社区 问答 正文

.NetSDKOSS下载调用GetObject返回的流少内容


通过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);
            }
        }

展开
收起
新视窗 2015-03-19 09:29:33 6421 分享 版权
阿里云 AI 助理回答

从您提供的代码片段来看,问题可能出在直接使用 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);
    }
}

在这个修改后的版本中,我使用了 MemoryStreamCopyTo 方法来确保所有响应内容都被正确读取并存储在内存中。这样可以避免因一次性读取不完全而导致的问题。同时,根据实际情况调整了返回值假设,使其能够携带读取到的字节数据,具体实现细节需根据您的ResponseImpl类设计进行调整。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答