Fitur Tersembunyi dari ASP.NET [ditutup]

292

Pertanyaan ini ada karena memiliki signifikansi historis, tetapi tidak dianggap sebagai pertanyaan yang baik untuk topik di situs ini, jadi tolong jangan gunakan itu sebagai bukti bahwa Anda dapat mengajukan pertanyaan serupa di sini.

Info lebih lanjut: https://stackoverflow.com/faq


Selalu ada fitur yang akan berguna dalam skenario pinggiran, tetapi karena alasan itulah kebanyakan orang tidak mengetahuinya. Saya meminta fitur yang biasanya tidak diajarkan oleh buku teks.

Apa yang kamu tahu?

Vaibhav
sumber
Pertanyaan bagus, saya berharap bisa memilih beberapa kali!
Gavin Miller
1
Sepakat. Saya suka utas seperti ini. Ada begitu banyak kedalaman pada kerangka itu, sehingga terkadang Anda kagum pada hal-hal yang tidak pernah Anda ketahui ada di sana.
Deane
Saya belajar banyak trik baru yang keren dari tanggapan di utas ini - terima kasih! :)
Maxim Zaslavsky
16
Alih-alih "Fitur tersembunyi dari .." seharusnya hal-hal ini tidak dinamai "Fitur Dikenal Sedikit dari .." karena sebagian besar setiap jawaban didokumentasikan dengan baik di MSDN atau di tempat lain, hanya tidak dikenal atau digunakan secara umum.
John K
Lihat meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… , dan posting Meta terkait untuk diskusi tentang kesesuaian dan penutupan.

Jawaban:

335

Saat menguji, Anda dapat mengirim email ke folder di komputer Anda, bukan ke server SMTP. Letakkan ini di web.config Anda:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
John Sheehan
sumber
6
Betulkah? Saya baru saja akan menginstal SMTP Server palsu, seperti Dumbster. Saya menyembunyikan permata.
Eduardo Molteni
2
Adakah yang tahu jika Anda dapat menentukan bagian UNC untuk lokasi direktori?
Mark Sherretta
32
Lebih baik lagi, letakkan ini di machine.config box dev Anda, jadi Anda tidak perlu mengubah web.config pada setiap aplikasi yang Anda buat.
Max Toro
Bisakah Anda atur jadi ini hanya pada host lokal? Dengan begitu Anda tidak perlu mengubahnya setiap saat?
chobo2
Tidak ada pengaturan untuk itu. Anda harus mengelola perbedaan konfigurasi menggunakan metode lain (Proyek Penerapan Web, Membangun tugas, dll)
John Sheehan
210

Jika Anda menempatkan file bernama app_offline.htm di root direktori aplikasi web, ASP.NET 2.0+ akan mematikan aplikasi dan menghentikan pemrosesan normal setiap permintaan masuk baru untuk aplikasi itu, hanya menampilkan konten app_offline.htm mengajukan semua permintaan baru .

Ini adalah cara tercepat dan termudah untuk menampilkan pemberitahuan "Situs Sementara Tidak Tersedia" Anda saat menggunakan kembali (atau memutar kembali) perubahan ke server Produksi.

Juga, seperti yang ditunjukkan oleh marxidad , pastikan Anda memiliki setidaknya 512 byte konten dalam file sehingga IE6 akan membuatnya dengan benar.

Troy DeMonbreun
sumber
10
Jangan lupa solusi untuk pesan "ramah" IE: tinyurl.com/app-offline-friendly
Mark Cidade
1
Aduh! Hati-hati saat menggunakan ini dengan MOSS 2007. Ini hanya akan berfungsi untuk halaman yang telah diakses sejak IIS terakhir restart. Jadi, jika Anda menambahkan halaman ini ke root virtual wss Anda, kemudian coba buka halaman yang belum diakses sebelumnya, Anda akan mendapatkan 404.
Marc
1
@Marc - Mendapat tip ini dari Scott Guthrie, jika Anda merasa murah hati, Anda akan membantu banyak SharePoint devs menghindari skenario ini jika Anda mengomentari artikel Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun
Plus, ini juga akan memicu daur ulang App Domain dan menutup koneksi database terbuka, setelah semua permintaan selesai.
Bart Verkoeijen
Ada peringatan untuk ini: IIS mengembalikan konten app_offline.htm dengan Kode Status HTTP 404. Jika mesin pencari berkeliaran dan mencoba untuk mengindeks situs Anda saat Anda dalam mode offline ini, Anda mungkin tidak menghargai hasilnya. Tapi ini berfungsi baik untuk aplikasi web perusahaan pribadi saya!
Larry Silverman
119
throw new HttpException(404, "Article not found");

Ini akan ditangkap oleh ASP.NET yang akan mengembalikan halaman customErrors. Pelajari tentang ini di .NET Tip of the Day Post baru-baru ini

John Sheehan
sumber
Beberapa pengembang dapat berargumen bahwa lebih baik membungkusnya secara manual di HttpContext.Response daripada melemparkan pengecualian yang merupakan operasi yang cukup mahal di buku .NET.
lubos hasko
Bukankah ini bentuk yang buruk? Anda menunjukkan kesalahan 404, sedangkan Anda ingin menampilkan kesalahan / pengecualian.
Donnie Thomas
1
Satu kasus yang bisa saya pikirkan adalah jika seseorang secara jahat mengacaukan parameter dan memasukkan sesuatu yang tidak valid, Anda mungkin menginginkan 404 generik bukan kesalahan spesifik.
John Sheehan
3
Terpilih murni karena saya sekarang mengetahui situs .NET Tip of the Day.
Kon
ini bekerja hanya ketika Anda melemparkannya di httpModule atau httpHandler
Khaled Musaied
75

Ini yang terbaik. Tambahkan ini ke web.config Anda untuk kompilasi yang JAUH lebih cepat. Ini adalah posting 3.5SP1 melalui QFE ini .

<compilation optimizeCompilations="true">

Ringkasan cepat: kami memperkenalkan sakelar optimalisasi Kompilasi baru di ASP.NET yang dapat sangat meningkatkan kecepatan kompilasi dalam beberapa skenario. Ada beberapa tangkapan, jadi baca terus untuk detail lebih lanjut. Switch ini saat ini tersedia sebagai QFE untuk 3.5SP1, dan akan menjadi bagian dari VS 2010.

Sistem kompilasi ASP.NET mengambil pendekatan yang sangat konservatif yang menyebabkannya menghapus semua pekerjaan sebelumnya yang telah dilakukannya setiap kali perubahan file 'tingkat atas'. File 'Tingkat atas' mencakup apa saja di nampan dan App_Code, serta global.asax Meskipun ini berfungsi dengan baik untuk aplikasi kecil, menjadi hampir tidak dapat digunakan untuk aplikasi yang sangat besar. Misalnya, seorang pelanggan mengalami kasus yang memerlukan waktu 10 menit untuk menyegarkan halaman setelah membuat perubahan apa pun ke rakitan 'tempat sampah'.

Untuk meringankan rasa sakit, kami menambahkan mode kompilasi 'dioptimalkan' yang mengambil pendekatan yang jauh lebih konservatif untuk kompilasi.

Lewat sini :

Scott Hanselman
sumber
6
Apakah ini "aktif secara default" dengan VS 2010 atau haruskah saya mencobanya?
M4N
73
  • HttpContext.Current akan selalu memberi Anda akses ke Permintaan / Respons / konteks konteks saat ini, bahkan ketika Anda tidak memiliki akses ke properti Halaman (misalnya, dari kelas pembantu yang ditambah secara longgar).

  • Anda dapat melanjutkan mengeksekusi kode pada halaman yang sama setelah mengalihkan pengguna ke yang lain dengan memanggil Response.Redirect ( url , false )

  • Anda tidak perlu file .ASPX jika semua yang Anda inginkan adalah Halaman yang dikompilasi (atau IHttpHandler ). Cukup atur jalur dan metode HTTP untuk menunjuk ke kelas di <httpHandlers>elemen dalam file web.config.

  • Sebuah Halaman objek dapat diambil dari ASPX berkas pemrograman dengan menelepon PageParser.GetCompiledPageInstance (VirtualPath, aspxFileName, Konteks)

Mark Cidade
sumber
Tentang Response.Redirect (url, false) - Itu adalah apa yang saya harapkan untuk waktu yang cukup lama .. Saya tidak tahu bagaimana saya melewatkan itu tetapi thanxxx
Subliminal Hash
1
Bisakah seseorang menjelaskan apa yang akan Anda lakukan dengan ini? Saya tahu ini memiliki beberapa nilai, tetapi saya tidak tahu mengapa ...
Deane
5
Jika Anda ingin mengarahkan pengguna ke alamat lain tetapi masih memiliki beberapa pemrosesan back-end untuk dilakukan (misalnya, permintaan pembuatan laporan yang mengalihkan ke halaman status pembuatan laporan sambil terus menghasilkan laporan di latar belakang)
Mark Cidade
Bisakah seseorang menjelaskan situasi yang berguna untuk PageParser.GetCompiledPageInstance (..)? Dokumen mengatakan untuk penggunaan infrastruktur - ia mengembalikan tipe IHttpHandler jadi saya tidak melihat bagaimana itu bisa digunakan secara praktis.
John K
@ jdk: Saya telah menggunakannya di masa lalu ketika menimpa penangan default untuk * .aspx permintaan sehingga saya dapat menggunakan objek IHttpHandler di-memori dinamis tetapi juga menggunakan GetCompiledPageInstance () untuk file fisik * .aspx.
Mark Cidade
70

Mode ritel di tingkat machine.config:

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

Mengesampingkan pengaturan web.config untuk menegakkan debug ke false, mengaktifkan kesalahan khusus dan menonaktifkan penelusuran. Tidak lagi lupa mengubah atribut sebelum penerbitan - biarkan semuanya dikonfigurasi untuk pengembangan atau lingkungan pengujian dan perbarui pengaturan ritel produksi.

Troy Hunt
sumber
1
Saya kadang-kadang lupa mengubah kompilasi debug ke false sebelum penerbitan, yang secara negatif mempengaruhi kinerja. Tidak masalah lagi!
Roy Tinker
59

Mengaktifkan intellisense untuk MasterPages di halaman konten
saya yakin ini adalah hack yang sangat sedikit diketahui

Sebagian besar waktu Anda harus menggunakan metode findcontrol dan melemparkan kontrol di halaman master dari halaman konten ketika Anda ingin menggunakannya, arahan MasterType akan memungkinkan intellisense di studio visual setelah Anda melakukannya.

cukup tambahkan satu lagi arahan ke halaman

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

Jika Anda tidak ingin menggunakan Jalur Virtual dan gunakan nama kelas sebagai gantinya

<%@ MasterType TypeName="MyMainMasterPage" %>

Dapatkan artikel lengkapnya di sini

Binoj Antony
sumber
Menggunakan FindControl kadang-kadang bisa sibuk, terima kasih atas tip yang bagus ini!
Alexandre Brisebois
4
Menggunakan ini dapat mengakibatkan perilaku yang tidak terduga. Lihat stackoverflow.com/questions/1998931/…
citronas
Secara pribadi saya pikir fitur harus dibiarkan tidak diketahui oleh orang-orang, itu memasangkan halaman ke masterpage. Jika Anda akhirnya menggunakan properti / metode masterpage dan kemudian mengubah masterpage Anda berakhir dengan mimpi buruk pemeliharaan.
Phill
@ Phil: Terkadang diperlukan dan memiliki akses yang diketik secara statis ke masterpage jauh lebih baik daripada pendekatan FindControl. Setidaknya Anda mendapatkan pesan kompiler dan dapat dengan cepat memperbaikinya.
Durden81
58

HttpContext.Items sebagai alat caching tingkat-permintaan

John Sheehan
sumber
2
Ini akan menjadi poin saya juga, saya menggunakan ini di kontrol bersarang untuk lulus / menerima informasi tingkat permintaan. Ii juga menggunakan ini dalam MVC untuk menyimpan daftar file js untuk ditambahkan, berdasarkan sebagian tampilan.
Tracker1
1
Saya menggunakan ini ketika saya menggunakan perutean asp.net untuk meneruskan parameter yang diambil dari url ke halaman saya. (tidak dengan MVC) bagus untuk menulis ulang url dan cukup fleksibel.
Alexandre Brisebois
Hmmmm, hanya memikirkan suatu tempat di mana saya bisa menggunakan ini bukannya Sesi - ta!
Mike Kingscott
52

Dua hal menonjol di kepala saya:

1) Anda dapat menghidupkan dan mematikan Trace dari kode:

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

2) Anda dapat membangun beberapa halaman .aspx hanya menggunakan satu file "code-behind" yang dibagikan.

Buat satu file .cs kelas:

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";
        }
    }

dan kemudian Anda dapat memiliki sejumlah halaman .aspx (setelah Anda menghapus .designer.cs dan .cs kode di belakang yang telah dihasilkan 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>

Anda dapat memiliki kontrol di ASPX yang tidak muncul di Class1, dan sebaliknya, tetapi Anda perlu mengingatkan untuk memeriksa kontrol Anda untuk nulls.

Radu094
sumber
Saya akan memilih ini, tetapi kehabisan suara. Saya akan mencoba dan ingat untuk kembali untuk memilih ini. Saya tidak tahu bahwa kami dapat memiliki file Code Behind yang sama untuk beberapa halaman. Tidak yakin, bagaimana cara kerjanya.
Vaibhav
5
Apakah ada orang lain yang berpikir itu risiko keamanan untuk memungkinkan Anda mengaktifkan jejak dari url? (# 1) Saya tidak akan menurunkan pertanyaan ini, tetapi penting untuk memahami risiko di sana.
Kevin Goff
5
Absolutelly, Anda harus benar-benar meletakkan kode itu di blok
#ifdef
Komentar yang bagus, menunjukkan aspek keamanan.
Vaibhav
2
Mengapa risiko keamanan untuk mengaktifkan jejak dari url? Bagaimana itu bisa digunakan untuk menyakiti saya?
Kamarey
48

Kamu bisa memakai:

 Request.Params[Control.UniqueId] 

Untuk mendapatkan nilai kontrol SEBELUM kondisi tampilan diinisialisasi (Control.Text dll akan kosong pada saat ini).

Ini berguna untuk kode di Init.

FlySwat
sumber
Inisialisasi kondisi tampilan tidak berlaku dengan Request.Params. Gunakan SEBELUM meningkatkan metode LoadPostData dari kontrol yang diterapkan IPostBackDataHandler.
chapluck
46

WebMetode.

Anda dapat menggunakan panggilan balik ASP.NET AJAX ke metode web yang ditempatkan di halaman ASPX. Anda dapat menghias metode statis dengan atribut [WebMethod ()] dan [ScriptMethod ()]. Sebagai contoh:

[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();
}

Sekarang, di halaman ASPX Anda, Anda dapat melakukan ini:

<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>

Dan panggil metode sisi server Anda melalui JavaScript menggunakan:

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

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>
Dan Diplo
sumber
45

Periksa untuk melihat apakah klien masih terhubung, sebelum memulai tugas yang sudah berjalan lama:

if (this.Response.IsClientConnected)
{
  // long-running task
}
RickNZ
sumber
44

Satu fitur ASP.NET yang dikenal dan jarang digunakan adalah:

Pemetaan Tag

Ini jarang digunakan karena hanya ada situasi tertentu di mana Anda akan membutuhkannya, tetapi ketika Anda membutuhkannya, itu benar berguna.

Beberapa artikel tentang fitur tahu kecil ini:

Tag Pemetaan di ASP.NET
Menggunakan Tag Mapping di ASP.NET 2.0

dan dari artikel terakhir itu:

Pemetaan tag memungkinkan Anda untuk menukar kontrol yang kompatibel pada waktu kompilasi pada setiap halaman dalam aplikasi web Anda. Contoh yang berguna adalah jika Anda memiliki kontrol ASP.NET saham, seperti DropDownList, dan Anda ingin menggantinya dengan kontrol khusus yang berasal dari DropDownList. Ini bisa menjadi kontrol yang telah disesuaikan untuk menyediakan caching data pencarian yang lebih optimal. Alih-alih mengedit setiap formulir web dan mengganti yang dibangun di DropDownLists dengan versi kustom Anda, Anda dapat meminta ASP.NET melakukannya untuk Anda dengan memodifikasi web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>
CraigTP
sumber
Ini akan sangat membingungkan bagi pengembang lain di tim Anda
Aykut Akıncı
1
@ Aykut - Memang bisa jadi, itulah sebabnya saya menyatakan bahwa kegunaannya agak sempit, namun, ketika diperlukan sangat berguna. Juga, saya akan memastikan bahwa setiap penggunaan Pemetaan Tag didokumentasikan dengan sangat jelas untuk menghindari kebingungan dan ambiguitas.
CraigTP
43

HttpModules . Arsitekturnya sangat elegan dan gila. Mungkin bukan fitur tersembunyi, tapi keren juga.

Allain Lalonde
sumber
3
HttpModules adalah sesuatu yang canggih, tapi saya tidak akan menyebutnya jarang atau kurang digunakan (atau panggil saya naif). Tapi ya, saya suka arsitekturnya.
Vaibhav
+1 karena banyak pengembang berpengalaman mungkin tahu tentang HttpModules tetapi tidak sepenuhnya memahami hubungan mereka dengan permintaan. (Hal yang sama dengan HttpHandlers)
John Bubriski
34

Anda dapat menggunakan Komentar ASP.NET dalam halaman .aspx untuk mengomentari seluruh bagian halaman termasuk kontrol server. Dan konten yang dikomentari tidak akan pernah dikirim ke klien.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Chris Pietschmann
sumber
5
Ada orang yang benar-benar tidak tahu bahwa ada komentar?
Joe Phillips
7
Aku suka kalau Anda menemukan setengah halaman aspx di <! - komentar ...
Bryan Rehbein
Ini adalah fitur yang agak telanjang dari ASP.NET
rafek
34

Pembuat Ekspresi Kode

Markup sampel:

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

Keindahan sebenarnya dari pembuat ekspresi kode adalah bahwa Anda dapat menggunakan penyatuan data seperti ekspresi dalam situasi yang bukan penyatuan data. Anda juga bisa membuat Pembuat Ekspresi lain yang melakukan fungsi lainnya.

web.config:

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

Kelas cs yang membuat semuanya terjadi:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 
andleer
sumber
1
apa maksudmu dengan "dan lainnya" dalam judul?
Khaled Musaied
Yah saya kira saya tidak pernah sampai ke yang lain.
andleer
2
+1, fitur sangat keren ... Itu sebenarnya sangat mirip dengan ekstensi markup WPF
Thomas Levesque
Bukankah ini sama dengan menggunakan <%= /*code*/ %>?
bevacqua
33

Penggunaan jenis file ASHX:
Jika Anda ingin hanya output beberapa html atau xml dasar tanpa melalui halaman event handler maka Anda dapat mengimplementasikan HttpModule secara sederhana

Beri nama halaman tersebut sebagai SomeHandlerPage.ashx dan cukup masukkan kode di bawah ini (hanya satu baris) di dalamnya

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

Lalu file kode

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
sumber
5
Perlu dicatat bahwa Anda harus menambahkan IRequiresSessionState atau IReadOnlySessionState jika Anda membutuhkannya, jika tidak, ia tidak akan ada di sana.
Tracker1
3
Perlu juga dicatat bahwa Anda dapat menentukan pengaturan handler di web.config sehingga Anda tidak perlu memiliki file ashx secara fisik. Atau Anda dapat mendaftarkan pawang secara programatik di aplikasi Anda mulai di global asax.
Phill
27

Mengatur Properti Kontrol Server Berdasarkan pada Browser Target dan banyak lagi .

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

Yang agak mengejutkan saya.

Omer van Kloeten
sumber
1
+1. Bisakah Anda memposting contoh kode pendek sebaris. Saya pikir itu akan menghasilkan lebih banyak perhatian dan peningkatan. Saya ingin yang ini naik.
John K
26

Saya bekerja pada aplikasi asp.net yang melalui audit keamanan oleh perusahaan keamanan terkemuka dan saya belajar trik mudah ini untuk mencegah kerentanan keamanan yang kurang diketahui tetapi penting.

Penjelasan di bawah ini dari: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Pertimbangkan menggunakan Page.ViewStateUserKey untuk melawan serangan satu-klik. Jika Anda mengautentikasi penelepon Anda dan menggunakan ViewState, setel properti Page.ViewStateUserKey di pawang event Page_Init untuk mencegah serangan satu-klik.

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

Tetapkan properti ke nilai yang Anda tahu unik untuk setiap pengguna, seperti ID sesi, nama pengguna, atau pengidentifikasi pengguna.

Serangan satu klik terjadi ketika penyerang membuat halaman Web (.htm atau .aspx) yang berisi bidang formulir tersembunyi bernama __VIEWSTATE yang sudah diisi dengan data ViewState. ViewState dapat dihasilkan dari halaman yang penyerang sebelumnya buat, seperti halaman keranjang belanja dengan 100 item. Penyerang memikat pengguna yang tidak menaruh curiga untuk meramban ke halaman, dan kemudian penyerang menyebabkan halaman dikirim ke server di mana kondisi tampilan yang valid. Server tidak memiliki cara untuk mengetahui bahwa kondisi tampilan berasal dari penyerang. Validasi ViewState dan HMACs tidak melawan serangan ini karena ViewState valid dan halaman dieksekusi di bawah konteks keamanan pengguna.

Dengan mengatur properti ViewStateUserKey, ketika penyerang meramban halaman untuk membuat ViewState, properti diinisialisasi dengan namanya. Ketika pengguna yang sah mengirimkan halaman ke server, itu diinisialisasi dengan nama penyerang. Akibatnya, pemeriksaan HMAC ViewState gagal dan pengecualian dihasilkan.

Craig McKeachie
sumber
2
Ingat juga untuk meninggalkan base.OnInit (e); untuk fungsi Page_Init () untuk melakukan tugasnya.
Druid
Saya pikir trik ini bisa gagal jika pengguna sungguhan tidak menerima cookie, atau jika sessionid memiliki batas waktu.
Aristos
1
Anda tidak perlu base.OnInit(e);jika menggunakan AutoEventWireup="true"untuk halaman tersebut.
Adam Nofsinger
1
Druid: Dia tidak mengesampingkan OnInit (dalam hal ini, base.OnInit (e) akan diperlukan).
crdx
Menggunakan ID sesi untuk ViewStateUserKey hanya berfungsi setelah sesi sebenarnya dimulai. Ini juga berarti bahwa halaman ini dapat habis setelah sesi berakhir. Dalam kasus di mana masalah tersebut menjadi perhatian, Anda mungkin mempertimbangkan menggunakan sesuatu yang lebih tahan lama, seperti alamat IP pengguna.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Ini bagus untuk menentukan skrip mana yang akan dihasilkan (min atau versi lengkap) atau apa pun yang Anda inginkan di dev, tetapi tidak langsung.

John Sheehan
sumber
Saya setuju dengan Jan, tetapi kadang-kadang mungkin menarik untuk memiliki aplikasi yang mengetahui status eksekusi Debug / Release.
Alexandre Brisebois
20

Termasuk dalam ASP.NET 3.5 SP1:

  • customErrors sekarang mendukung atribut "redirectMode" dengan nilai "ResponseRewrite". Menampilkan halaman kesalahan tanpa mengubah URL.
  • Tag formulir sekarang mengenali atribut tindakan. Sangat cocok untuk saat Anda menggunakan penulisan ulang URL
John Sheehan
sumber
20

Properti DefaultButton di Panel.

Ini menetapkan tombol default untuk panel tertentu.

MRG
sumber
1
Perhatian, tidak berfungsi pada semua jenis tombol, misalnya LinkButtons!
Kovu
19

Menggunakan configSource untuk membagi file konfigurasi.

Anda dapat menggunakan atribut configSource di file web.config untuk mendorong elemen konfigurasi ke file .config lainnya, misalnya, alih-alih:

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

... Anda dapat menyimpan seluruh bagian pengaturan aplikasi di file konfigurasi lain. Inilah yang baru web.config:

    <appSettings configSource="myAppSettings.config" />

The myAppSettings.configFile:

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

Ini cukup berguna untuk skenario di mana Anda menyebarkan aplikasi ke pelanggan dan Anda tidak ingin mereka mengganggu file web.config itu sendiri dan hanya ingin mereka dapat mengubah hanya beberapa pengaturan.

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

Ryan Shripat
sumber
1
Ini juga bekerja pada semua jenis proyek .net, ex Desktop app. configs
Zoltan Veres
17

Atribut MaintainScrollPositionOnPostback dalam Halaman direktif. Ini digunakan untuk mempertahankan posisi gulir halaman aspx di seluruh postback.

MRG
sumber
1
Sebuah komentar akan sangat membantu untuk meningkatkan jawabannya.
MRG
16

HttpContext.IsCustomErrorEnabled adalah fitur keren. Saya telah menemukan itu berguna lebih dari sekali. Ini ada posting singkat tentang itu.

Kilhoffer
sumber
16

Secara default, konten apa pun di antara tag untuk kontrol khusus ditambahkan sebagai kontrol anak. Ini dapat dicegat dalam override AddParsedSubObject () untuk pemfilteran atau penguraian tambahan (misalnya, konten teks dalam 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
sumber
13

Jika Anda memiliki ASP.NET menghasilkan umpan RSS, kadang-kadang akan menempatkan baris tambahan di bagian atas halaman. Ini tidak akan divalidasi dengan validator RSS umum. Anda dapat mengatasinya dengan menempatkan arahan halaman <@Page>di bagian bawah halaman.

Kevin Goff
sumber
7
Tidakkah Anda lebih baik menggunakan penangan .ASHX untuk menghasilkan umpan RSS?
Dan Diplo
Saya kira itu tergantung pada kompleksitas proyek. Tidak setiap orang memiliki kemampuan atau keterampilan untuk membuat dan menyusun penangan. Dalam halaman, asp.net bekerja dengan cukup baik untuk ini
Kevin Goff
1
Dan Anda dapat menggunakan sesuatu seperti <asp: Repeater> untuk menghasilkan item RSS dan melakukan trik lain (seperti menggunakan LogInView untuk menghapus beberapa item) yang jauh lebih baik daripada menulis string dari ASHX IMO
chakrit
LinqToXml + ASHX adalah caranya!
Carlos Muñoz
Ini berguna untuk lebih dari sekadar pembuatan umpan RSS. IIRC, HTML5 harus memiliki tag <! Doctype html> pada baris pertama di atas untuk memvalidasi dengan benar.
Roy Tinker
12

Sebelum ASP.NET v3.5 menambahkan rute Anda dapat membuat URL ramah Anda sendiri hanya dengan menulis HTTPModule ke dan menulis ulang permintaan di awal pipa halaman (seperti acara BeginRequest).

Url seperti http: // servername / halaman / Param1 / SomeParams1 / Param2 / SomeParams2 akan dipetakan ke halaman lain seperti di bawah ini (sering menggunakan ekspresi reguler).

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

DotNetNuke memiliki HttpModule yang sangat bagus yang melakukan ini untuk url ramah mereka. Masih bermanfaat untuk mesin di mana Anda tidak dapat menggunakan .NET v3.5.

Tyler
sumber
Ini membutuhkan pemetaan semua permintaan IIS ke ASP.NET
John Sheehan
Atau hanya penangan kesalahan 404.
FlySwat