1. Contexto:
- Problemas persistentes de conexão: Para conexões não persistentes, o navegador pode definir os limites da entidade solicitante ou de resposta conforme a conexão está fora do ar ou não; Para conexões contínuas, essa abordagem obviamente não funciona. Às vezes, mesmo tendo enviado todos os dados, o navegador não sabe se haverá novos dados entrando na conexão aberta, então ele apenas espera.
- Resolver com Comprimento do Conteúdo: Calcule o comprimento da entidade e informe para a outra parte através da cabeça. O navegador pode perceber que a entidade de resposta está acima pela informação de comprimento do Conteúdo
- Novo problema com o comprimento do conteúdo: Como o campo Comprimento do Conteúdo deve realmente refletir o comprimento da entidade, o comprimento é desconhecido para conteúdo gerado dinamicamente até que o conteúdo seja criado. Neste momento, para obter o comprimento com precisão, você só pode abrir um buffer grande o suficiente e esperar todo o conteúdo ser gerado antes de calcular. No entanto, isso exige mais sobrecarga de memória por um lado, e por outro, fará o cliente esperar mais.
- Precisamos de um novo mecanismo que não dependa do comprimento do cabeçalho e conheça os limites das entidades - Transfer-Encoding: chunked.
2. Codificação de Transferência (em blocos)
- Transfer-Encoding é um campo de cabeçalho HTTP (campo de cabeçalho de resposta), que literalmente significa "codificação de transferência". A especificação HTTP mais recente define apenas um tipo de transporte de codificação: em chunks.
- A codificação de transferência em blocos é um mecanismo de transferência de dados no Protocolo de Transferência de Hipertexto (HTTP) que permite que dados HTTP enviados por um servidor web ao cliente sejam divididos em múltiplas partes. A codificação por transporte de blocos está disponível apenas na versão 1.1 do protocolo HTTP (HTTP/1.1).
- Os dados são divididos em uma série de blocos e enviados em um ou mais blocos para que o servidor possa enviar dados sem saber o tamanho total do conteúdo enviado antecipadamente.
Métodos específicos
- Após adicionar o Transfer-Encoding: chunked ao cabeçalho, significa que o pacote é chunked. Nesse caso, as entidades no pacote precisam ser transmitidas em uma série de blocos.
- Cada bloco contém o valor do comprimento hexadecimal e os dados, e o valor do comprimento é exclusivo de uma linha, e o comprimento não inclui o CRLF no final dela, nem o CRLF no final dos dados fragmentados.
- O último valor do comprimento do bloco deve ser 0, e os dados correspondentes não têm conteúdo, indicando o fim da entidade.
asp.net Código de teste principal:
|