使用带有HttpWebRequest的TextWriter Stream进行内存不足

时间:2011-03-25 19:32:48

标签: c# memory httpwebrequest textwriter

感谢您对OOM(内存不足)问题的精彩suggestions,我在代码中看到了为Web服务传输文件的问题。 [我希望可以启动另一个提供更多细节的线程。]根据建议,我缩小了用于从文件中读取的缓冲区大小,看起来内存消耗更好,但我仍然看到OOM问题,我看到这个问题的文件大小小到5MB。我可能想要处理十倍大的文件。

我现在的问题似乎是使用TextWriter。

我按如下方式创建了一个请求[进行了一些编辑以缩小代码]:

HttpWebRequest oRequest = (HttpWebRequest)WebRequest.Create(new Uri(strURL));
oRequest.Method = httpMethod;
oRequest.ContentType = "application/atom+xml";
oRequest.Headers["Authorization"] = getAuthHeader();
oRequest.ContentLength = strHead.Length + strTail.Length + longContentSize;
oRequest.SendChunked = true;

using (TextWriter tw = new StreamWriter(oRequest.GetRequestStream()))
{
    tw.Write(strHead);
    using (FileStream fileStream = new FileStream(strPath, FileMode.Open, 
           FileAccess.Read, System.IO.FileShare.ReadWrite))
    {
        StreamEncode(fileStream, tw);
    }
    tw.Write(strTail);
}
.....

调用例程:

public void StreamEncode(FileStream inputStream, TextWriter tw)
{
    // For Base64 there are 4 bytes output for every 3 bytes of input
    byte[] base64Block = new byte[9000];
    int bytesRead = 0;
    string base64String = null;

    do
    {
        // read one block from the input stream
        bytesRead = inputStream.Read(base64Block, 0, base64Block.Length);

        // encode the base64 string
        base64String = Convert.ToBase64String(base64Block, 0, bytesRead);

        // write the string
        tw.Write(base64String);


    } while (bytesRead !=0 );

}

由于潜在的大内容,我应该使用TextWriter之外的其他内容吗?能够创建请求的整个有效负载似乎非常方便。

这完全是错误的方法吗?我希望能够支持非常大的文件。

0 个答案:

没有答案