Sto scrivendo un servizio web (usando ASP.NET MVC) e per scopi di supporto vorremmo essere in grado di registrare le richieste e le risposte il più vicino possibile al formato raw, on-the-wire (cioè incluso HTTP metodo, percorso, tutte le intestazioni e il corpo) in un database.
Ciò di cui non sono sicuro è come ottenere questi dati nel modo meno "alterato". Posso ricostituire ciò che credo assomigli alla richiesta controllando tutte le proprietà HttpRequest
dell'oggetto e costruendo una stringa da loro (e similmente per la risposta), ma mi piacerebbe davvero ottenere i dati effettivi di richiesta / risposta che sono inviato sul filo.
Sono felice di utilizzare qualsiasi meccanismo di intercettazione come filtri, moduli, ecc. E la soluzione può essere specifica per IIS7. Tuttavia, preferirei tenerlo solo nel codice gestito.
Qualche consiglio?
Modifica: noto che HttpRequest
ha un SaveAs
metodo che può salvare la richiesta su disco ma questo ricostruisce la richiesta dallo stato interno usando un carico di metodi di supporto interno a cui non è possibile accedere pubblicamente (proprio perché questo non consente il salvataggio in un utente fornito stream non lo so). Quindi inizia a sembrare che dovrò fare del mio meglio per ricostruire il testo richiesta / risposta dagli oggetti ... gemere.
Modifica 2: Nota che ho detto che l' intera richiesta include metodo, percorso, intestazioni, ecc. Le risposte attuali guardano solo i flussi del corpo che non includono queste informazioni.
Modifica 3: nessuno legge domande qui? Cinque risposte finora, eppure nessuno suggerisce nemmeno un modo per ottenere l'intera richiesta non elaborata. Sì, so di poter acquisire i flussi di output, le intestazioni e l'URL e tutto il resto dall'oggetto richiesta. Ho già detto che nella domanda, vedi:
Posso ricostituire ciò che credo assomigli alla richiesta controllando tutte le proprietà dell'oggetto HttpRequest e costruendo una stringa da loro (e similmente per la risposta) ma mi piacerebbe davvero ottenere i dati effettivi di richiesta / risposta che viene inviato sul filo.
Se conosci i dati grezzi completi (inclusi intestazioni, url, metodo http, ecc.) Semplicemente non possono essere recuperati, sarebbe utile saperlo. Allo stesso modo se sai come ottenere tutto nel formato non elaborato (sì, intendo ancora includere intestazioni, url, metodo http, ecc.) Senza doverlo ricostruire, che è quello che ho chiesto, sarebbe molto utile. Ma dirmi che posso ricostruirlo da HttpRequest
/ HttpResponse
oggetti non è utile. Lo so. L'ho già detto.
Nota: prima che qualcuno inizi a dire che questa è una cattiva idea, o limiterà la scalabilità, ecc., Implementeremo anche meccanismi di limitazione, consegna sequenziale e anti-replay in un ambiente distribuito, quindi è comunque richiesta la registrazione del database. Non sto cercando una discussione se questa è una buona idea, sto cercando come può essere fatto.