Como entregar arquivos grandes no ASP.NET Respons

Não estou procurando nenhuma alternativa de streaming de conteúdo de arquivo do banco de dados, na verdade estou procurando a raiz do problema, esse arquivo estava em execução até o IIS 6, onde executamos nosso aplicativo no modo clássico, agora atualizamos nosso IIS para 7 e está executando o pool de aplicativos no modo de pipeline e esse problema foi iniciado.

Eu tenho um manipulador, onde tenho que entregar arquivos grandes a pedido do cliente. E eu enfrento os seguintes problemas,

s arquivos têm tamanho médio de 4 a 100 MB, portanto, vamos considerar o caso de download de arquivo de 80 M

Buffering, início lento

Response.BufferOutput = True;

Isso resulta em um início muito lento do arquivo, pois os downloads do usuário e até a barra de progresso não aparecem até alguns segundos, geralmente de 3 a 20 segundos, o motivo é que o IIS lê o arquivo inteiro primeiro, determina o comprimento do conteúdo e inicia o arquivo transferir. O arquivo está sendo reproduzido no player de vídeo e é executado muito, muito lentamente; no entanto, o iPad baixa apenas a fração do arquivo primeiro, para que ele funcione rapidament

Buffer desativado, sem comprimento de conteúdo, início rápido, sem progresso

Reponse.BufferOutput = False;

Isso resulta no início imediato, no entanto, o cliente final (navegador típico como o Chrome) também não conhece o comprimento do conteúdo, pois o IIS também não conhece, portanto, não exibe progresso; em vez disso, ele diz que o download do X KB é feit

Buffering Off, Comprimento manual do conteúdo, Início rápido, Progresso e Violação de protocolo

Response.BufferOutput = False;
Response.AddHeader("Content-Length", file.Length);

Isso resulta no download correto correto de arquivos no Chrome etc., no entanto, em alguns casos, o manipulador do IIS resulta no erro "Conexão fechada do cliente remoto" (isso é muito frequente) e outros resultados de WebClient em violação de protocolo. Isso acontece de 5 a 10% de todos os pedidos, nem todos os pedido

Acho que o que está acontecendo é que o IIS não envia nada chamado 100 continue quando não fazemos buffer e o cliente pode se desconectar sem esperar nenhuma saída. No entanto, a leitura de arquivos da origem pode levar mais tempo, mas no lado do cliente eu aumentei o tempo limite, mas parece que o tempo limite do IIS não tem control

Existe alguma maneira de forçar o Response a enviar 100 continuações e não deixar ninguém fechar a conexão?

ATUALIZA

Eu encontrei os seguintes cabeçalhos no Firefox / Chrome; nada parece incomum aqui por violação de protocolo ou cabeçalho incorret

Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:1728000
Cache-Control:private
Content-Disposition:attachment; filename="24.jpg"
Content-Length:22355
Content-Type:image/pjpeg
Date:Wed, 07 Mar 2012 13:40:26 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

UPDATE 2

@ Turning Recycling ainda não ofereceu muito, mas aumentei meu MaxWorkerProcess para 8 e agora recebo menos número de erros do que ante

Mas, em média, de 200 solicitações em um segundo, 2 a 10 solicitações falham .., e isso acontece em quase todos os segundos alternativo

UPDATE 3

Continuando 5% das solicitações que falharam com "O servidor cometeu uma violação de protocolo. Section = ResponseStatusLine", eu tenho outro programa que baixa conteúdo do servidor da web que usa o WebClient e que emite esse erro de 4 a 5 vezes por segundo, em média Eu tenho 5% dos pedidos falhando. Existe alguma maneira de rastrear a falha do WebClient?

Problemas redefinidos

Zero Byte File Received

IIS fecha a conexão por algum motivo, no lado do cliente no WebConfig, recebo 0 bytes para o arquivo que não tem zero bytes. Fazemos a verificação de hash SHA1, isso nos informa que, no servidor Web IIS, nenhum erro é registrado.

Este foi meu erro, e foi resolvido enquanto estamos usando o Entity Framework, ele estava lendo sujo (linhas não confirmadas), pois a leitura não estava no escopo da transação, colocando-o no escopo da transação resolveu esse problem

Exceção de violação de protocolo gerada

WebClient lança WebException dizendo "O servidor cometeu uma violação de protocolo. Section = ResponseStatusLine.

Eu sei que posso ativar a análise de cabeçalho insegura, mas esse não é o ponto; quando é o meu manipulador HTTP que está enviando cabeçalhos adequados, não sei por que o IIS está enviando algo extra (verificado no firefox e chrome, nada incomum), isso acontece apenas 2% das vezes.

UPDATE 4

Found sc-win32 64 error e eu li em algum lugar que WebLimits for MinBytesPerSecond deve ser alterado de 240 para 0, ainda assim tudo é igual. No entanto, notei que sempre que o IIS registra o erro 64 sc-win32, o IIS registra o Status HTTP como 200, mas houve algum erro. Agora não consigo ativar o Failed Trace Logging for 200 porque isso resultará em arquivos enormes.

Ambos os problemas acima foram resolvidos aumentando MinBytesPerSecond e, além de desativar as Sessões, adicionei respostas detalhadas resumindo todos os ponto

questionAnswers(8)

yourAnswerToTheQuestion