Estou escrevendo um serviço da Web (usando o ASP.NET MVC) e, para fins de suporte, gostaríamos de poder registrar as solicitações e respostas o mais próximo possível do formato bruto on-the-wire (ou seja, incluindo HTTP método, caminho, todos os cabeçalhos e o corpo) em um banco de dados.
O que não tenho certeza é como se apossar desses dados da maneira menos 'confusa'. Posso reconstituir a aparência da solicitação, inspecionando todas as propriedades do HttpRequest
objeto e construindo uma string a partir delas (e da mesma forma para a resposta), mas eu realmente gostaria de me apossar dos dados reais de solicitação / resposta que são enviado no fio.
É um prazer usar qualquer mecanismo de interceptação, como filtros, módulos, etc., e a solução pode ser específica ao IIS7. No entanto, eu preferiria mantê-lo apenas no código gerenciado.
Alguma recomendação?
Editar: notei que HttpRequest
possui um SaveAs
método que pode salvar a solicitação em disco, mas isso reconstrói a solicitação a partir do estado interno usando uma carga de métodos auxiliares internos que não podem ser acessados publicamente (por que isso não permite salvar em um usuário fornecido) fluxo que eu não sei). Então está começando a parecer que vou ter que fazer o meu melhor para reconstruir o texto da solicitação / resposta dos objetos ... gemer.
Editar 2: Observe que eu disse que toda a solicitação, incluindo método, caminho, cabeçalhos, etc. As respostas atuais apenas examinam os fluxos do corpo que não incluem essas informações.
Edit 3: Ninguém lê perguntas por aqui? Cinco respostas até o momento e ainda nem uma delas sugere uma maneira de obter todo o pedido bruto on-the-wire. Sim, eu sei que posso capturar os fluxos de saída e os cabeçalhos, a URL e todas essas coisas do objeto de solicitação. Eu já disse isso na pergunta, veja:
Posso reconstituir a aparência da solicitação, inspecionando todas as propriedades do objeto HttpRequest e construindo uma string a partir delas (e da mesma forma para a resposta), mas eu realmente gostaria de me apossar dos dados reais da solicitação / resposta que é enviado pelo fio.
Se você souber que os dados brutos completos (incluindo cabeçalhos, URL, método http etc.) simplesmente não podem ser recuperados, isso seria útil. Da mesma forma, se você souber como obter tudo no formato bruto (sim, eu ainda quero dizer incluindo cabeçalhos, URL, método http, etc.) sem precisar reconstruí-lo, como pedi, isso seria muito útil. Mas me dizer que posso reconstruí-lo a partir de HttpRequest
/ HttpResponse
objects não é útil. Eu sei disso. Eu já disse isso.
Observação: antes que alguém comece a dizer que é uma má idéia ou que limite a escalabilidade, etc., também estaremos implementando mecanismos de otimização, entrega sequencial e anti-replay em um ambiente distribuído, de modo que o log do banco de dados seja necessário. Não estou à procura de uma discussão sobre se essa é uma boa ideia, estou procurando como isso pode ser feito.