2009-08-24 4 views
5

Używa ASP.NET 2.0 w świecie IIS 6.Czy mogę zmienić wartość wartości POST bez ponownego wpisywania?

Mam użytkownika przesyłającego formularz, który wysyła dane za pośrednictwem POST. Strona otrzymująca dane wykonuje kilka prostych weryfikacji. Jeśli sprawdzanie poprawności przebiega, uruchamiana jest procedura kodu w czarnej ramce, która zasadniczo odczytuje dane za pomocą Request.Form ("NameHere").

Chciałbym móc zmienić wartość pozycji POST, a następnie umieścić ją ponownie na POST. Nie mam możliwości modyfikowania kodu, który odczytuje Request.Form ("NameHere"), więc moim pomysłem jest zmodyfikowanie danych podczas zdarzenia ładowania strony. Jeśli zmienię wartość pozycji POST, wówczas kod czarnej skrzynki nie musi być modyfikowany.

Czy możliwa jest zmiana wartości pozycji w protokole HTTP POST?

Czy ktoś to zrobił?

Dzięki!

+0

Przykro mi, że wszyscy nie ustawili jednego jako odpowiedzi. Mój projekt się zmienił i nie stać mnie na czas, aby zweryfikować przedstawione rozwiązania. Naprawdę doceniam, że poświęciłeś czas, aby pomóc nie tylko mnie, ale także przyszłym ludziom, którzy szukają i znajdują to pytanie z odpowiedziami. – MADCookie

Odpowiedz

12

Mimo że jest nieco hacky, istnieje sposób na zmianę wartości zmiennej POST.

Możemy użyć Odbicie, aby oznaczyć kolekcję Request.Form jako nieczytelną, zmienić wartość tego, co chcemy, i oznaczyć ją ponownie jako przeczytaną ponownie (aby inne osoby nie mogły zmienić wartości). Użyj następującej funkcji:

protected void SetFormValue(string key, string value) 
{ 
    var collection = HttpContext.Current.Request.Form; 

    // Get the "IsReadOnly" protected instance property. 
    var propInfo = collection.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

    // Mark the collection as NOT "IsReadOnly" 
    propInfo.SetValue(collection, false, new object[] { }); 

    // Change the value of the key. 
    collection[key] = value; 

    // Mark the collection back as "IsReadOnly"  
    propInfo.SetValue(collection, true, new object[] { }); 
} 

Przetestowałem kod na moim komputerze i działa dobrze. Nie mogę jednak udzielać żadnych gwarancji wydajności ani przenośności.

+0

Nie polecam zmieniania danych formularzy, ponieważ jest super hacky :), ale +1, ponieważ jest to dobra technika do poznania i może być używana gdzie indziej. – user961954

+0

To uratowało mój bekon - musiałem wstawić do QueryString, aby wstawić nowy front metody, która oczekuje, że poprawne HttpResposne zawierające dane wejściowe jako QueryString. –

1

widzę jako jedyny sposób na zmianę pierwotnego miejsca docelowego POST na swój własny, a następnie w kodzie wszystkie żądania, które trafiają do twojego adresu, są wysyłane na adres czarnej skrzynki.

Istnieje jednak pewien nadmiar kosztów.

o ile pamiętam, zbieranie formularzy jest niemodyfikowalne, prawda? nie pamiętam dokładnej struktury, ale myślę, że nie będzie działać.

pozdrowienia

2

Obecny POST nie mogą być zmieniane, jednak można utworzyć nowe żądanie POST i przekierować do tego.