2008-12-22 10 views
17

Jak najlepiej przechwycić HTML (w moim przypadku, do logowania) renderowane przez stronę aspx?Przechwytywanie HTML wygenerowany z ASP.NET

Nie chcę, aby wracać do strony za pomocą Response.Write, ponieważ zakłóca to układ mojej strony.

Używanie Response.OutputStream lub Response.Output za wyniki strumień w ArgumentException ({System.ArgumentException. Stream nie był czytelny)

+0

Krótko mówiąc, należy zastąpić metodę renderowania dla strony. Podobne pytania i odpowiedzi [tutaj] (http://stackoverflow.com/questions/56279/export-aspx-to-html) –

Odpowiedz

23

Dobre pytanie, musiałem wypróbować i zobaczyć, czy mógłbym stworzyć HttpModule, aby zrobić to, co opisujesz.

Nie miałem szczęścia, próbując odczytać odpowiedź, ale użycie ResponseFiltera dało mi sposób na przechwycenie zawartości.

Poniższy kod wydaje się działać całkiem nieźle i pomyślałem, że możesz użyć kodu jako bazy. Ale pamiętaj, że to jest coś, co szybko rzuciłem w siebie, to nie zostało w żaden sposób przetestowane. Więc nie używaj go w żadnym środowisku produkcyjnym bez odpowiedniego przeglądu/testowania i tak dalej. Można to jednak skomentować;)

+0

To właśnie było potrzebne do http://stackoverflow.com/questions/1020045/how-to-trace-scriptservice-webservice-requests. Dzięki! – jrummell

+0

Musiałem użyć zdarzenia BeginRequest do ustawienia filtra, PreRequestHandlerExecute nie uruchomił mojego modułu HttpModule. Nie zastanawiałem się dlaczego, ale może to pomoże komuś innemu. – JeremyWeir

+0

Niesamowite rozwiązanie problemu! –

4

Wielu testerów obciążenia pozwoli Ci zalogować odpowiedzi HTTP generowane, ale mieć na Umysł z ASP.NET może to być bardzo duże pliki dziennika.

Edytuj: Filtr odpowiedzi, zgodnie z kodem Toma Jelena, ma na celu nadanie tego rodzaju nadzoru i odpowiedzi. W przeciwnym razie nie można odczytać innego strumienia.

Edit 2: Na stronie, a nie HttpModule

public class ObserverStream : Stream 
{ 
    private byte[] buffer = null; 
    private Stream observed = null; 

    public ObserverStream (Stream s) 
    { 
    this.observed = s; 
    } 

    /* important method to extend #1 : capturing the data */ 
    public override void Write(byte[] buffer, int offset, int count) 
    { 
    this.observed.Write(buffer, offset, count); 
    this.buffer = buffer; //captured! 
    } 

    /* important method to extend #2 : doing something with the data */ 
    public override void Close() 
    { 
    //this.buffer available for logging here! 
    this.observed.Close(); 
    } 

    /* override all the other Stream methods/props with this.observed.method() */ 

    //... 

} 

i w Page_Load (lub przed swoją odpowiedź jest napisane tak)

Response.Filter = new ObserverStream(Response.Filter); 
+0

Korzystanie ze strumienia Response.OutputStream lub Response.Output powoduje wywołanie ArgumentException ({System.ArgumentException: Stream było nieczytelne.) – lastas

+0

Czy starałeś się najpierw zerować? Napisz do czytelnego MemStream? (teraz sam rozpalam VS, bo chcę wiedzieć jak to zrobić) – annakata

+0

Heh, właśnie chciałem opublikować cały kod Response.Filter, który właśnie napisałem i znalazłem Toma Jelena zrobione właśnie to. Pracował dla mnie też w zasadzie :) – annakata

1

Jednym ze sposobów, aby po stronie serwera XMLHTTP Żądaj własnego serwera. Chwyć wynik i zapisz go do pliku lub bazy danych.

Alternatywnie można użyć AJAX na kliencie, pobrać wynik i POST go z powrotem na serwer.

+2

podwojenie liczby zapytań wydaje się złe, ponieważ dane są gdzieś za pierwszym razem – annakata

Powiązane problemy