Pergunta

Eu estou acessando um httpwebrequest que retorna um arquivo PDF como a resposta. Estou lendo essa resposta em um fluxo de memória, e depois converter para um arquivo. O problema é, é que centenas de arquivos estão sendo criados. Não sei por que, eu tentei muitas maneiras, e todos fazem o mesmo ... Este é o primeiro método que retorna o memorystream.

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

Segundo a se converter ao FileStream ...

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.CreateNew);
            fs.Write(data, 0, data.Length);

Todas as idéias?

Editar para adicionar mais código ...

    public MemoryStream GetToStream()
    {
        if (_Req == null)
            throw new Exception("HttpWebRequest is not initialised");

        GetResult(_Req);

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

        _ResponseStream.Close();

        if (memStream.Length > 0)
            return memStream;
        else return null;
    }

newFile é o caminho mapeado para o servidor do arquivo para criar.

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.Create);
            fs.Write(data, 0, data.Length);
            fs.Close();

Eu tentei stream.WriteTo (fs), e mesma coisa ocorre. Muito Bizzare.

Foi útil?

Solução

Não é claro por que você deseja obter vários arquivos, mas você deve ser capaz de obter alguns informações com base nos nomes de arquivos - cada um corresponderia a um valor de newFile

Noto que você não está fechando seu fluxo de arquivo, pelo caminho. Usando File.WriteAllBytes é uma maneira muito mais simples de alcançar seu objetivo, e não requer que você feche qualquer coisa:

byte[] data = stream.ToArray();
File.WriteAllBytes(newFile, data);

Uma alternativa é ainda usar um FileStream (com uma declaração using) mas o uso MemoryStream.WriteTo para evitar a chamada para ToArray que tem de copiar todos os dados:

using (FileStream fs = File.Create(newFile))
{
    stream.WriteTo(fs);
}

Outras dicas

Gostaria de sugerir que você está recebendo mais pedidos de seu cliente do que você pensa. Verifique se o seu arquivo de log de acesso webserver. Os trechos de código que você está mostrando parece razoável, mas realmente não mostram suficiente do código para explicar o problema - você não está mostrando a parte direita do código. De qualquer forma, verifique o log de acesso ou usar algum tipo de rastreamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top