Ukryte funkcje ASP.NET [zamknięte]

292

To pytanie istnieje, ponieważ ma znaczenie historyczne, ale nie jest uważane za dobre, tematyczne pytanie dla tej witryny, więc nie używaj go jako dowodu, że możesz zadawać podobne pytania tutaj.

Więcej informacji: https://stackoverflow.com/faq


Zawsze są funkcje przydatne w scenariuszach skrajnych, ale właśnie z tego powodu większość ludzi ich nie zna. Proszę o funkcje, których zwykle nie uczą podręczniki.

Jakie są te, które znasz?

Vaibhav
źródło
Dobre pytanie, chciałbym móc głosować wiele razy!
Gavin Miller
1
Zgoda. Uwielbiam takie wątki. Struktura jest tak głęboka, że ​​czasami zdumiewa cię to, o czym nigdy nie wiedziałeś.
Deane
Uczę się tylu nowych fajnych sztuczek na podstawie odpowiedzi w tym wątku - dzięki! :)
Maxim Zaslavsky
16
Zamiast „Ukryte funkcje…” nie powinny być nazywane „mało znanymi funkcjami…”, ponieważ większość każdej odpowiedzi jest dobrze udokumentowana w MSDN lub gdzie indziej, po prostu mało znana lub używana.
John K
Zobacz meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226 /... i powiązane posty Meta, aby omówić stosowność i zamknięcie.

Odpowiedzi:

335

Podczas testowania możesz wysyłać wiadomości e-mail do folderu na komputerze zamiast na serwer SMTP. Umieść to w swoim web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
John Sheehan
źródło
6
Naprawdę? Właśnie miałem zainstalować fałszywy serwer SMTP, taki jak Dumbster. Ukryłem klejnot.
Eduardo Molteni,
2
Czy ktoś wie, czy możesz określić udział UNC dla lokalizacji katalogu?
Mark Sherretta
32
Jeszcze lepiej, umieść to na dev box machine.config, abyś nie musiał zmieniać web.config w każdej tworzonej aplikacji.
Max Toro
Czy możesz to ustawić tak, aby działało to tylko na lokalnym hoście? W ten sposób nie musisz go zmieniać za każdym razem?
chobo2,
Nie ma na to żadnego ustawienia. Będziesz musiał zarządzać różnic konfiguracyjnych za pomocą innych metod (projekty, zadania wdrażania sieci budować, etc)
John Sheehan
210

Jeśli umieścisz plik o nazwie app_offline.htm w katalogu głównym katalogu aplikacji WWW, ASP.NET 2.0+ zamknie aplikację i zatrzyma normalne przetwarzanie wszelkich nowych przychodzących żądań dla tej aplikacji, pokazując tylko zawartość app_offline.htm plik dla wszystkich nowych wniosków .

Jest to najszybszy i najłatwiejszy sposób wyświetlenia powiadomienia „Witryna tymczasowo niedostępna” podczas ponownego wdrażania (lub wycofywania) zmian na serwerze produkcyjnym.

Ponadto, jak zauważył Marksidad , upewnij się, że masz co najmniej 512 bajtów zawartości w pliku, aby IE6 poprawnie go renderował.

Troy DeMonbreun
źródło
10
Nie zapomnij o obejściu „przyjaznych” wiadomości IE: tinyurl.com/app-offline-friendly
Mark Cidade
1
Auć! Zachowaj ostrożność podczas korzystania z tej funkcji w MOSS 2007. Będzie działać tylko w przypadku stron, do których uzyskano dostęp od czasu ostatniego ponownego uruchomienia IIS. Tak więc, jeśli dodasz tę stronę do wirtualnego katalogu głównego wss, a następnie spróbuj otworzyć stronę, do której wcześniej nie uzyskiwano dostępu, otrzymasz 404.
Marc
1
@Marc - Otrzymałem tę wskazówkę od Scotta Guthrie, jeśli czujesz się hojny, pomógłbyś wielu deweloperom SharePoint uniknąć tego scenariusza, jeśli skomentowałeś artykuł Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun
Ponadto spowoduje to również ponowne uruchomienie domeny aplikacji i zamknie wszystkie otwarte połączenia z bazą danych po zakończeniu wszystkich żądań.
Bart Verkoeijen
Jest jedno zastrzeżenie: IIS zwraca zawartość app_offline.htm z kodem stanu HTTP 404. Jeśli wyszukiwarka wędruje i spróbuje zaindeksować witrynę, gdy jesteś w trybie offline, możesz nie docenić wyników. Ale działa świetnie w mojej prywatnej korporacyjnej aplikacji internetowej!
Larry Silverman,
119
throw new HttpException(404, "Article not found");

To zostanie przechwycone przez ASP.NET, który zwróci stronę customErrors. Dowiedziałem się o tym w ostatnim poście .NET Tip of the Day Post

John Sheehan
źródło
Niektórzy programiści mogą argumentować, że lepiej jest ręcznie owijać rzeczy w HttpContext.Response, zamiast zgłaszać wyjątek, który jest dość kosztowną operacją w książkach .NET.
lubos hasko
Czy to nie jest zła forma? Wyświetlany jest błąd 404, podczas gdy chcesz wyświetlić błąd / wyjątek.
Donnie Thomas
1
Jednym z przykładów, o których mogę pomyśleć, jest to, że jeśli ktoś złośliwie psuje parametry i wprowadza coś nieprawidłowego, prawdopodobnie chcesz, aby ogólny błąd 404 nie był konkretnym błędem.
John Sheehan
3
Pozytywnie oceniany, ponieważ teraz jestem świadomy witryny .NET Tip of the Day.
Kon
działa tylko wtedy, gdy wrzucisz go do httpModule lub httpHandler
Khaled Musaied
75

Oto najlepszy. Dodaj to do pliku web.config, aby uzyskać DUŻO szybszą kompilację. To jest po 3.5SP1 za pośrednictwem tego QFE .

<compilation optimizeCompilations="true">

Szybkie podsumowanie: wprowadzamy nowy przełącznik optimizeCompilations w ASP.NET, który może znacznie poprawić szybkość kompilacji w niektórych scenariuszach. Istnieje kilka połowów, więc czytaj dalej, aby uzyskać więcej informacji. Ten przełącznik jest obecnie dostępny jako QFE dla 3.5SP1 i będzie częścią VS 2010.

System kompilacji ASP.NET przyjmuje bardzo konserwatywne podejście, które powoduje, że usuwa wszelkie poprzednie prace, które wykonał za każdym razem, gdy zmienia się plik „najwyższego poziomu”. Pliki „najwyższego poziomu” zawierają wszystko w bin i App_Code, a także global.asax. Chociaż działa to dobrze w przypadku małych aplikacji, staje się prawie bezużyteczne w przypadku bardzo dużych aplikacji. Np. Klient wpadł na przypadek, w którym odświeżenie strony zajęło 10 minut po wprowadzeniu jakichkolwiek zmian w zestawie „bin”.

Aby złagodzić ból, dodaliśmy „zoptymalizowany” tryb kompilacji, który przyjmuje znacznie mniej konserwatywne podejście do ponownej kompilacji.

Via tutaj :

Scott Hanselman
źródło
6
Czy jest to „domyślnie włączone” w VS 2010, czy powinienem to wypróbować?
M4N,
73
  • HttpContext.Current zawsze zapewnia dostęp do żądania / odpowiedzi / bieżącego kontekstu, nawet gdy nie masz dostępu do właściwości strony (np. Z luźno powiązanej klasy pomocnika).

  • Możesz kontynuować wykonywanie kodu na tej samej stronie po przekierowaniu użytkownika na inny, wywołując Response.Redirect ( url , false )

  • Nie potrzebujesz plików .ASPX , jeśli wszystko, czego potrzebujesz, to skompilowana strona (lub dowolny IHttpHandler ). Wystarczy ustawić ścieżkę i metody HTTP, aby wskazywały klasę w <httpHandlers>elemencie pliku web.config.

  • Obiekt strony można pobrać programowo z pliku .ASPX , wywołując PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)

Mark Cidade
źródło
About Response.Redirect (url, false) - To tyle, na co liczyłem od dłuższego czasu .. Nie wiem, jak to przegapiłem, ale thanxxx
Subliminal Hash
1
Czy ktoś może wyjaśnić, co byś z tym zrobił? Wiem, że to ma jakąś wartość, ale nie mogę zrozumieć, dlaczego ...
Deane
5
Jeśli chcesz przekierować użytkownika na inny adres, ale nadal masz trochę przetwarzania zaplecza (np. Żądanie generowania raportu, które przekierowuje na stronę statusu generowania raportu, podczas gdy nadal generuje raport w tle)
Mark Cidade
Czy ktoś może wyjaśnić użyteczną sytuację dla PageParser.GetCompiledPageInstance (..)? Dokumenty mówią, że jest do użytku w infrastrukturze - zwraca typ IHttpHandler, więc nie widzę, jak można go praktycznie wykorzystać.
John K,
@jdk: Używałem go w przeszłości podczas nadpisywania domyślnego modułu obsługi żądań * .aspx, dzięki czemu mogę używać dynamicznych obiektów IHttpHandler w pamięci, ale także używać GetCompiledPageInstance () dla fizycznych plików * .aspx.
Mark Cidade
70

Tryb sprzedaży detalicznej na poziomie machine.config:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

Zastępuje ustawienia web.config, aby wymusić debugowanie na false, włącza niestandardowe błędy i wyłącza śledzenie. Nie musisz już zapominać o zmianie atrybutów przed opublikowaniem - po prostu pozostaw je wszystkie skonfigurowane dla środowisk programistycznych lub testowych i zaktualizuj ustawienia produkcji detalicznej.

Troy Hunt
źródło
1
Czasami zapominam zmienić debugowanie kompilacji na false przed opublikowaniem, co negatywnie wpływa na wydajność. Nie ma już problemu!
Roy Tinker,
59

Włączanie intellisense dla MasterPages na stronach z treściami
Jestem pewien, że jest to bardzo mało znany hack

W większości przypadków musisz użyć metody findcontrol i rzucić formanty na stronie wzorcowej ze stron zawartości, gdy chcesz ich użyć, dzięki dyrektywie MasterType włączysz intellisense w Visual Studio, gdy tylko to zrobisz.

po prostu dodaj do strony jeszcze jedną dyrektywę

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

Jeśli nie chcesz korzystać z wirtualnej ścieżki i zamiast tego użyj nazwy klasy

<%@ MasterType TypeName="MyMainMasterPage" %>

Pobierz pełny artykuł tutaj

Binoj Antony
źródło
Korzystanie z FindControl może być czasem gorączkowe, dzięki za tę wspaniałą wskazówkę!
Alexandre Brisebois,
4
Korzystanie z tego może spowodować nieoczekiwane zachowanie. Zobacz stackoverflow.com/questions/1998931/...
citronas
Osobiście uważam, że funkcja powinna pozostać nieznana, łączy stronę ze stroną główną. Jeśli w końcu użyjesz właściwości / metod strony głównej, a następnie zmienisz stronę główną, skończysz koszmarem konserwacji.
Phill
@Phil: Czasami jest to potrzebne i posiadanie statycznie wpisanego dostępu do strony głównej jest znacznie lepsze niż podejście FindControl. Przynajmniej dostaniesz komunikat kompilatora i możesz go szybko naprawić.
Durden81
58

HttpContext.Items jako narzędzie buforujące na poziomie żądania

John Sheehan
źródło
2
To też będzie mój punkt, używam tego w kontrolerach zagnieżdżonych do przekazywania / odbierania informacji o poziomie żądania. Używam tego również w MVC do przechowywania listy plików js do dołączenia, opartych na widokach częściowych.
Tracker1
1
Używam tego, gdy używam routingu asp.net do przekazywania parametrów pobranych z adresów URL na moje strony. (nie w przypadku MVC) doskonale nadaje się do przepisywania adresów URL i jest dość elastyczny.
Alexandre Brisebois,
Hmmmm, właśnie pomyślałem o miejscu, w którym mógłbym użyć tego zamiast sesji - ta!
Mike Kingscott,
52

Dwie rzeczy wyróżniają się w mojej głowie:

1) Możesz włączyć lub wyłączyć Śledzenie za pomocą kodu:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) Możesz zbudować wiele stron .aspx przy użyciu tylko jednego udostępnionego pliku „zakodowanego”.

Zbuduj jeden plik .cs klasy:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

a następnie możesz mieć dowolną liczbę stron .aspx (po usunięciu kodu .designer.cs i .cs wygenerowanego przez VS):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

Możesz mieć kontrolki w ASPX, które nie pojawiają się w klasie 1 i na odwrót, ale musisz pamiętać, aby sprawdzić, czy nie ma w nich kontroli.

Radu094
źródło
Głosowałbym za tym, ale zabrakło mi głosów. Spróbuję i pamiętam, aby wrócić i zagłosować w tej sprawie. Nie wiedziałem, że możemy mieć ten sam plik Code Behind dla wielu stron. Nie jestem pewien, jak to by działało.
Vaibhav,
5
Czy ktoś jeszcze uważa, że ​​aktywacja śledzenia z adresu URL stanowi zagrożenie bezpieczeństwa? (# 1) Nie zamierzam głosować za tym pytaniem, ale ważne jest, aby zrozumieć ryzyko.
Kevin Goff,
5
Absolutnie powinieneś naprawdę umieścić ten kod w bloku #ifdef DEBUG #endif
Radu094,
Świetne komentarze, wskazujące na aspekt bezpieczeństwa.
Vaibhav,
2
Dlaczego aktywowanie śledzenia z adresu URL jest zagrożeniem dla bezpieczeństwa? Jak można go zranić?
Kamarey,
48

Możesz użyć:

 Request.Params[Control.UniqueId] 

Aby uzyskać wartość kontrolki PRZED zainicjalizowaniem stanu widoku (Control.Text itp. Będzie pusty w tym momencie).

Jest to przydatne dla kodu w Init.

FlySwat
źródło
Inicjalizacja Viewstate nie działa z Request.Params. Użyj go PRZED podniesieniem metody LoadPostData kontroli zaimplementowanej IPostBackDataHandler.
chapluck,
46

WebMethods.

Można używać wywołań zwrotnych AJAX ASP.NET do metod sieciowych umieszczonych na stronach ASPX. Możesz ozdobić metodę statyczną za pomocą atrybutów [WebMethod ()] i [ScriptMethod ()]. Na przykład:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

Teraz na stronie ASPX możesz to zrobić:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

I wywołaj metodę po stronie serwera za pomocą JavaScript, używając:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>
Dan Diplo
źródło
45

Przed rozpoczęciem długotrwałego zadania sprawdź, czy klient jest nadal podłączony:

if (this.Response.IsClientConnected)
{
  // long-running task
}
RickNZ
źródło
44

Jedną mało znaną i rzadko używaną funkcją ASP.NET jest:

Mapowanie tagów

Jest rzadko używany, ponieważ jest tylko konkretna sytuacja, w której będziesz go potrzebować, ale gdy go potrzebujesz, jest to bardzo przydatne.

Niektóre artykuły o tej mało znanej funkcji:

Mapowanie znaczników w ASP.NET
Korzystanie z mapowania znaczników w ASP.NET 2.0

i z tego ostatniego artykułu:

Mapowanie znaczników umożliwia zamianę zgodnych elementów sterujących w czasie kompilacji na każdej stronie aplikacji internetowej. Przydatnym przykładem jest sytuacja, w której masz zapasową kontrolkę ASP.NET, taką jak DropDownList, i chcesz zastąpić ją niestandardową kontrolką pochodzącą z DropDownList. Może to być formant, który został dostosowany w celu zapewnienia bardziej zoptymalizowanego buforowania danych wyszukiwania. Zamiast edytować każdy formularz internetowy i zastępować wbudowane DropDownLists niestandardową wersją, możesz w efekcie wykonać ASP.NET, modyfikując web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>
CraigTP
źródło
Byłoby to bardzo mylące dla innych programistów w twoim zespole
Aykut Akıncı
1
@Aykut - Rzeczywiście może tak być, dlatego stwierdzam, że jego użyteczność jest raczej wąska, jednak w razie potrzeby bardzo przydatna. Chciałbym również upewnić się, że wszelkie użycie mapowania tagów było bardzo wyraźnie udokumentowane, aby uniknąć nieporozumień i dwuznaczności.
CraigTP
43

HttpModules . Architektura jest szalenie elegancka. Może nie jest to ukryta funkcja, ale mimo wszystko fajna.

Allain Lalonde
źródło
3
HttpModules jest czymś zaawansowanym, ale nie nazwałbym tego rzadkim lub rzadziej używanym (lub nazwałby mnie naiwnym). Ale tak, kocham architekturę.
Vaibhav,
+1, ponieważ wielu doświadczonych programistów może wiedzieć o HttpModules, ale nie w pełni rozumie ich związek z żądaniami. (To samo z HttpHandlers)
John Bubriski
34

Za pomocą komentarzy ASP.NET na stronie .aspx można komentować pełne części strony, w tym kontrolki serwera. Treść skomentowana nigdy nie zostanie wysłana do klienta.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Chris Pietschmann
źródło
5
Są ludzie, którzy naprawdę nie wiedzą, że są komentarze?
Joe Phillips
7
Podoba mi się, gdy znajdziesz pół strony aspx w <! - komentarze ...
Bryan Rehbein
Jest to raczej naga funkcja ASP.NET
rafek
34

Konstruktor wyrażeń kodowych

Przykładowy znacznik:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

Prawdziwe piękno konstruktora wyrażeń kodu polega na tym, że można używać wiązania danych jak wyrażeń w sytuacjach niezwiązanych z danymi. Możesz także tworzyć inne Konstruktory wyrażeń, które wykonują inne funkcje.

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

Klasa cs, która sprawia, że ​​wszystko się dzieje:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 
Andleer
źródło
1
co masz na myśli z „i innymi” w tytule?
Khaled Musaied
Cóż, chyba nigdy nie dotarłem do innych.
andleer
2
+1, naprawdę fajna funkcja ... To właściwie całkiem podobne do rozszerzeń WPF
Thomas Levesque
czy to nie to samo, co używanie <%= /*code*/ %>?
bevacqua
33

Użycie typu pliku ASHX:
Jeśli chcesz po prostu wyprowadzić jakiś podstawowy HTML lub XML bez przechodzenia przez procedury obsługi zdarzeń strony, możesz zaimplementować HttpModule w prosty sposób

Nazwij stronę jako SomeHandlerPage.ashx i po prostu umieść w niej poniższy kod (tylko jeden wiersz)

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Następnie plik kodu

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}
Binoj Antony
źródło
5
Warto zauważyć, że należy dodać IRequiresSessionState lub IReadOnlySessionState, jeśli jest to potrzebne, w przeciwnym razie go nie będzie.
Tracker1
3
Warto również zauważyć, że możesz określić konfigurację modułu obsługi w pliku web.config, więc nie musisz mieć fizycznego pliku ashx. Lub możesz zarejestrować programowo program obsługi w aplikacji start w globalnym asaxie.
Phill
27

Ustawianie właściwości sterowania serwerem na podstawie przeglądarki docelowej i nie tylko .

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

Ten jeden rodzaj mnie zaskoczył.

Omer van Kloeten
źródło
1
+1. Czy możesz zamieścić krótki przykładowy kod w tekście. Myślę, że przyniesie to więcej uwagi i pozytywnych opinii. Chcę, żeby ten poszedł w górę.
John K
26

Pracowałem nad aplikacją asp.net, która przeszła audyt bezpieczeństwa prowadzony przez wiodącą firmę ochroniarską i nauczyłem się tej prostej sztuczki, aby zapobiec mniej znanej, ale ważnej luce w zabezpieczeniach.

Poniższe wyjaśnienie pochodzi z: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Rozważ użycie Page.ViewStateUserKey do przeciwdziałania atakom za pomocą jednego kliknięcia. Jeśli uwierzytelniasz osoby dzwoniące i używasz ViewState, ustaw właściwość Page.ViewStateUserKey w module obsługi zdarzeń Page_Init, aby zapobiec atakom za pomocą jednego kliknięcia.

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

Ustaw właściwość na wartość, o której wiesz, że jest unikalna dla każdego użytkownika, na przykład identyfikator sesji, nazwę użytkownika lub identyfikator użytkownika.

Atak jednym kliknięciem ma miejsce, gdy osoba atakująca utworzy stronę internetową (.htm lub .aspx) zawierającą ukryte pole formularza o nazwie __VIEWSTATE, które jest już wypełnione danymi ViewState. ViewState można wygenerować ze strony wcześniej utworzonej przez atakującego, takiej jak strona koszyka na zakupy zawierająca 100 elementów. Atakujący zwabia niczego niepodejrzewającego użytkownika do przeglądania strony, a następnie atakujący powoduje wysłanie strony na serwer, na którym poprawne jest ViewState. Serwer nie może wiedzieć, że ViewState pochodzi od atakującego. Sprawdzanie poprawności ViewState i HMAC nie przeciwdziałają temu atakowi, ponieważ ViewState jest prawidłowy, a strona jest wykonywana w kontekście bezpieczeństwa użytkownika.

Ustawiając właściwość ViewStateUserKey, gdy osoba atakująca przejdzie do strony w celu utworzenia ViewState, właściwość jest inicjowana na swoje imię. Gdy uprawniony użytkownik prześle stronę na serwer, zostaje ona zainicjowana nazwą atakującego. W rezultacie sprawdzenie ViewMate HMAC kończy się niepowodzeniem i generowany jest wyjątek.

Craig McKeachie
źródło
2
Pamiętaj również, aby opuścić bazę.OnInit (e); aby funkcja Page_Init () wykonała swoje zadanie.
Druid
Myślę, że ta sztuczka może się nie powieść, jeśli prawdziwy użytkownik nie zaakceptuje plików cookie lub jeśli sessionid ma limit czasu.
Aristos
1
Nie potrzebujesz, base.OnInit(e);jeśli używasz AutoEventWireup="true"strony.
Adam Nofsinger
1
Druid: Nie zastępuje OnInit (w takim przypadku konieczne byłoby base.OnInit (e)).
crdx
Używanie identyfikatora sesji dla ViewStateUserKey działa tylko po faktycznym rozpoczęciu sesji. Oznacza to również, że strony te mogą przekroczyć limit czasu po zakończeniu sesji. W przypadkach, w których problemy te dotyczą, możesz rozważyć użycie czegoś bardziej trwałego, na przykład adresu IP użytkownika.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Jest to świetne do określania, które skrypty mają być generowane (wersje minimalne lub pełne) lub cokolwiek innego, czego możesz chcieć w dev, ale nie na żywo.

John Sheehan
źródło
Zgadzam się z Janem, ale czasami może być interesująca mieć aplikację, która jest świadoma stanu wykonania Debug / Release.
Alexandre Brisebois,
20

Zawarte w ASP.NET 3.5 SP1:

  • customErrors obsługuje teraz atrybut „redirectMode” o wartości „ResponseRewrite”. Pokazuje stronę błędu bez zmiany adresu URL.
  • Tag formularza rozpoznaje teraz atrybut akcji. Idealne, gdy używasz przepisywania adresów URL
John Sheehan
źródło
20

Właściwość DefaultButton w panelach.

Ustawia domyślny przycisk dla określonego panelu.

MRG
źródło
1
Uwaga, nie działa na wszelkiego rodzaju przyciskach, np. LinkButtons!
Kovu
19

Używanie configSource do dzielenia plików konfiguracyjnych.

Możesz użyć atrybutu configSource w pliku web.config, aby wypchnąć elementy konfiguracji do innych plików .config, na przykład zamiast:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

... możesz mieć całą sekcję appSettings zapisaną w innym pliku konfiguracyjnym. Oto nowe web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.configPliku:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

Jest to bardzo przydatne w scenariuszach, w których wdrażasz aplikację na kliencie i nie chcesz, aby ingerował w sam plik web.config i po prostu chciał, aby mogli zmienić tylko kilka ustawień.

ref: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

Ryan Shripat
źródło
1
Działa to również w przypadku dowolnego typu projektu .net, np. Aplikacja komputerowa. configs
Zoltan Veres
17

Atrybut MaintainScrollPositionOnPostback w dyrektywie strony. Służy do utrzymania pozycji przewijania strony aspx w postbackach.

MRG
źródło
1
Komentarz byłby pomocny, aby poprawić odpowiedź.
MRG
16

HttpContext.IsCustomErrorEnabled to fajna funkcja, która okazała się przydatna więcej niż raz. Oto krótki post na ten temat.

Kilhoffer
źródło
16

Domyślnie każda zawartość między znacznikami dla formantu niestandardowego jest dodawana jako formant podrzędny. Można to przechwycić w przesłonięciu AddParsedSubObject () w celu filtrowania lub dodatkowej analizy (np. Zawartości tekstu w LiteralControls):

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>
Mark Cidade
źródło
13

Jeśli program ASP.NET generuje kanał RSS, czasami umieści dodatkowy wiersz na górze strony. To nie sprawdza się w przypadku popularnych walidatorów RSS. Możesz obejść ten problem, umieszczając dyrektywę strony <@Page>na dole strony.

Kevin Goff
źródło
7
Czy nie lepiej byłoby użyć programu .ASHX do generowania kanałów RSS?
Dan Diplo
Myślę, że to zależy od złożoności projektu. Nie każdy ma zdolność lub umiejętności do tworzenia i kompilowania programów obsługi. Na stronie asp.net działa do tego całkiem dobrze
Kevin Goff,
1
I możesz użyć czegoś takiego jak <asp: Repeater> do generowania elementów RSS i robienia innych sztuczek (takich jak używanie LogInView do usuwania niektórych elementów), co jest znacznie lepsze niż pisanie ciągów z ASHX IMO
chakrit
LinqToXml + ASHX to najlepsza droga!
Carlos Muñoz
Jest to przydatne do znacznie więcej niż generowania kanału RSS. IIRC, HTML5 musi mieć znacznik <! Doctype html> w pierwszym wierszu u góry, aby poprawnie sprawdzić poprawność.
Roy Tinker,
12

Przed dodaniem tras przez program ASP.NET v3.5 można utworzyć własne przyjazne adresy URL, pisząc moduł HTTP i przepisując żądanie na początku potoku strony (np. Zdarzenie BeginRequest).

Adresy URL takie jak http: // nazwa_serwera / strona / Param1 / SomeParams1 / Param2 / SomeParams2 zostaną zmapowane na inną stronę, jak poniżej (często przy użyciu wyrażeń regularnych).

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke ma naprawdę dobry HttpModule, który robi to dla swoich przyjaznych adresów URL. Nadal jest przydatny na komputerach, na których nie można wdrożyć .NET v3.5.

Tyler
źródło
Wymaga to mapowania wszystkich żądań IIS do ASP.NET
John Sheehan,
Lub po prostu program obsługi błędów 404.
FlySwat