คุณสมบัติที่ซ่อนของ ASP.NET [ปิด]


292

คำถามนี้มีอยู่เพราะมีความสำคัญทางประวัติศาสตร์ แต่ไม่ถือว่าเป็นคำถามในหัวข้อที่ดีสำหรับเว็บไซต์นี้ดังนั้นโปรดอย่าใช้เป็นหลักฐานว่าคุณสามารถถามคำถามที่คล้ายกันได้ที่นี่

ข้อมูลเพิ่มเติม: https://stackoverflow.com/faq


มีคุณสมบัติที่จะเป็นประโยชน์ในสถานการณ์สมมติเสมอ แต่ด้วยเหตุผลนั้นเองที่คนส่วนใหญ่ไม่รู้จัก ฉันขอคุณสมบัติที่ไม่ได้สอนโดยหนังสือเรียน

คุณรู้อะไรบ้าง


เป็นคำถามที่ดีฉันต้องการได้คะแนนหลายครั้ง!
Gavin Miller

1
ตกลง ฉันชอบกระทู้เช่นนี้ มีความลึกในกรอบมากจนบางครั้งคุณก็ประหลาดใจกับสิ่งที่คุณไม่เคยรู้มาก่อน
Deane

ฉันกำลังเรียนรู้เทคนิคใหม่ ๆ มากมายจากคำตอบในกระทู้นี้ - ขอบคุณ! :)
Maxim Zaslavsky

16
ไม่ใช่ "คุณสมบัติที่ซ่อนอยู่ของ .. " ไม่ควรตั้งชื่อสิ่งเหล่านี้ว่า "คุณสมบัติที่เป็นที่รู้จักน้อยของ .. " เพราะคำตอบส่วนใหญ่นั้นมีการบันทึกไว้เป็นอย่างดีใน MSDN หรือที่อื่น ๆ
John K

ดูmeta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/ …และ Meta Meta ที่เกี่ยวข้องสำหรับการอภิปรายเกี่ยวกับความเหมาะสมและการปิด

คำตอบ:


335

ในขณะทดสอบคุณสามารถส่งอีเมลไปยังโฟลเดอร์ในคอมพิวเตอร์ของคุณแทนเซิร์ฟเวอร์ SMTP วางสิ่งนี้ไว้ในเว็บของคุณ config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

6
จริงๆ? ฉันกำลังจะติดตั้งเซิร์ฟเวอร์ SMTP ปลอมเช่น Dumbster ฉันซ่อนอัญมณี
Eduardo Molteni

2
ไม่มีใครรู้ว่าคุณสามารถระบุการแบ่งปัน UNC สำหรับที่ตั้งไดเรกทอรีหรือไม่
Mark Sherretta

32
ยังดีกว่าใส่สิ่งนี้ไว้ในเครื่อง dev box ของคุณเพื่อให้คุณไม่ต้องเปลี่ยนเว็บเป็น config ในทุกแอพที่คุณสร้าง
Max Toro

คุณสามารถตั้งค่าเพื่อให้มันทำในพื้นที่ท้องถิ่น? ด้วยวิธีนี้คุณไม่จำเป็นต้องเปลี่ยนทุกครั้งหรือไม่
chobo2

ไม่มีการตั้งค่าสำหรับสิ่งนั้น คุณจะมีความแตกต่างในการจัดการการตั้งค่าการใช้วิธีการอื่น ๆ (โครงการเว็บการปรับใช้งานรูปร่าง ฯลฯ )
จอห์นซีแฮน

210

หากคุณวางไฟล์ชื่อapp_offline.htm ในรูทของไดเรกทอรีแอปพลิเคชันเว็บ ASP.NET 2.0+ จะปิดแอปพลิเคชันและหยุดการประมวลผลคำขอขาเข้าใหม่สำหรับแอปพลิเคชันนั้นตามปกติโดยแสดงเฉพาะเนื้อหาของ app_offline.htm ไฟล์สำหรับการร้องขอมาใหม่ทั้งหมด

นี่เป็นวิธีที่รวดเร็วและง่ายที่สุดในการแสดงการแจ้งเตือน "ไซต์ชั่วคราวไม่พร้อมใช้งาน" ของคุณในขณะที่ปรับใช้ (หรือย้อนกลับ) การเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ผลิต

นอกจากนี้ตามที่ระบุโดยmarxidadตรวจสอบให้แน่ใจว่าคุณมีเนื้อหาอย่างน้อย 512 ไบต์ภายในไฟล์ดังนั้น IE6 จะแสดงผลอย่างถูกต้อง


10
อย่าลืมวิธีแก้ปัญหาสำหรับข้อความ "เป็นมิตร" ของ IE: tinyurl.com/app-offline-friendly
Mark Cidade

1
อุ๊ย! ระวังเมื่อใช้สิ่งนี้กับ MOSS 2007 มันจะใช้ได้เฉพาะกับหน้าเว็บที่เข้าถึงได้ตั้งแต่ IIS รีสตาร์ทครั้งล่าสุด ดังนั้นถ้าคุณเพิ่มหน้านี้ให้ WSS รากเสมือนของคุณแล้วพยายามที่จะเปิดหน้าเว็บที่ไม่ได้รับการเข้าถึงก่อนหน้านี้คุณจะได้รับ 404
มาร์ค

1
@Marc - รับคำแนะนำนี้จาก Scott Guthrie หากคุณรู้สึกใจกว้างคุณจะช่วยผู้พัฒนา SharePoint จำนวนมากหลีกเลี่ยงสถานการณ์นี้หากคุณแสดงความคิดเห็นในบทความของ Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun

นอกจากนี้สิ่งนี้จะทริกเกอร์การรีไซเคิลของ App Domain และปิดการเชื่อมต่อฐานข้อมูลใด ๆ ที่เปิดหลังจากคำขอทั้งหมดเสร็จสิ้น
Bart Verkoeijen

มีข้อควรระวังสำหรับสิ่งนี้: IIS ส่งคืนเนื้อหา app_offline.htm ด้วยรหัสสถานะ HTTP 404 หากเครื่องมือค้นหาเดินไปมาและพยายามจัดทำดัชนีไซต์ของคุณขณะที่คุณอยู่ในโหมดออฟไลน์คุณอาจไม่พอใจกับผลลัพธ์ แต่มันใช้งานได้ดีสำหรับเว็บแอพองค์กรส่วนตัวของฉัน!
Larry Silverman

119
throw new HttpException(404, "Article not found");

สิ่งนี้จะถูกจับโดย ASP.NET ซึ่งจะส่งคืนหน้า customErrors เรียนรู้เกี่ยวกับสิ่งนี้ในคำแนะนำ. NET ล่าสุดของ Day Post


นักพัฒนาบางคนอาจโต้แย้งว่าเป็นการดีกว่าที่จะห่อสิ่งต่างๆด้วยตนเองใน HttpContext.Response แทนที่จะทิ้งข้อยกเว้นซึ่งเป็นการดำเนินการที่ค่อนข้างแพงในหนังสือ. NET
lubos hasko

แบบฟอร์มนี้ไม่ดีเหรอ? คุณกำลังแสดงข้อผิดพลาด 404 ในขณะที่คุณต้องการแสดงข้อผิดพลาด / ข้อยกเว้น
Donnie Thomas

1
กรณีหนึ่งที่ฉันคิดได้ก็คือถ้ามีใครบางคนยุ่งกับพารามิเตอร์และทำให้บางอย่างไม่ถูกต้องคุณอาจต้องการ 404 ทั่วไปไม่ใช่ข้อผิดพลาดเฉพาะ
John Sheehan

3
อัปเดตอย่างหมดจดเพราะตอนนี้ฉันทราบไซต์. NET เคล็ดลับประจำวันแล้ว
Kon

มันจะทำงานเฉพาะเมื่อคุณโยนมันใน httpModule หรือ HttpHandler
เลด Musaied

75

นี่คือสิ่งที่ดีที่สุด เพิ่มไปยัง web.config ของคุณเพื่อการรวบรวมที่รวดเร็วยิ่งขึ้น นี่คือ 3.5SP1 โพสต์ผ่านQFEนี้

<compilation optimizeCompilations="true">

สรุปอย่างย่อ: เราขอแนะนำสวิตช์เพิ่มประสิทธิภาพใหม่ใน ASP.NET ที่สามารถปรับปรุงความเร็วในการรวบรวมได้อย่างมากในบางสถานการณ์ มีการจับได้ดังนั้นอ่านรายละเอียดเพิ่มเติมได้ที่ ขณะนี้สวิตช์นี้พร้อมใช้งานเป็น QFE สำหรับ 3.5SP1 และจะเป็นส่วนหนึ่งของ VS 2010

ระบบการคอมไพล์ ASP.NET จะใช้วิธีการที่ระมัดระวังมากซึ่งทำให้การลบงานก่อนหน้านี้ที่ได้ทำเมื่อใดก็ตามที่มีการเปลี่ยนแปลงไฟล์ 'ระดับบนสุด' ไฟล์ 'ระดับสูงสุด' รวมถึงไฟล์ใดก็ได้ใน bin และ App_Code รวมถึง global.asax แม้ว่าจะใช้งานได้ดีกับแอปขนาดเล็ก แต่มันก็ไม่สามารถใช้ได้กับแอพขนาดใหญ่มาก เช่นลูกค้ากำลังทำงานในกรณีที่ใช้เวลา 10 นาทีในการรีเฟรชหน้าเว็บหลังจากทำการเปลี่ยนแปลงใด ๆ กับชุดประกอบ 'ถังขยะ'

เพื่อลดความเจ็บปวดเราได้เพิ่มโหมดการคอมไพล์ที่ได้รับการปรับให้เหมาะสมซึ่งใช้วิธีการคอมไพล์น้อยกว่า

ผ่านที่นี่ :


6
นี่คือ "เปิดใช้งานโดยค่าเริ่มต้น" กับ VS 2010 หรือฉันควรทดลองใช้งานหรือไม่
M4N

73
  • HttpContext.Currentจะช่วยให้คุณสามารถเข้าถึงคำขอ / การตอบกลับ / บริบทของบริบทปัจจุบันได้แม้ว่าคุณจะไม่สามารถเข้าถึงคุณสมบัติของเพจ (เช่นจากคลาสตัวช่วยเหลือแบบอิสระคู่)

  • คุณสามารถรันโค้ดในหน้าเดียวกันต่อไปหลังจากเปลี่ยนเส้นทางผู้ใช้ไปยังอีกคนหนึ่งโดยเรียกResponse.Redirect ( url , false )

  • คุณไม่จำเป็นต้องใช้ไฟล์. ASPXหากคุณต้องการเพียงแค่รวบรวมหน้า (หรือIHttpHandlerใด ๆ) เพียงแค่ตั้งค่าพา ธ และเมธอด HTTP เพื่อชี้ไปที่คลาสใน<httpHandlers>องค์ประกอบในไฟล์ web.config

  • หน้าวัตถุสามารถเรียกดูได้จากขอบไฟล์โปรแกรมโดยการเรียกPageParser.GetCompiledPageInstance (virtualPath, aspxFileName บริบท)


เกี่ยวกับ Response.Redirect (url, false) - นั่นเป็นสิ่งที่ฉันคาดหวังมานานมาก .. ฉันไม่รู้ว่าฉันพลาดไปได้อย่างไร แต่ thanxxx
Hash อ่อนเกิน

1
ใครสามารถอธิบายสิ่งที่คุณจะทำกับสิ่งนี้ ฉันรู้ว่ามันมีค่าบางอย่าง แต่ฉันไม่สามารถคิดออกว่าทำไม ...
ดีน

5
หากคุณต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังที่อยู่อื่น แต่ยังมีการประมวลผลส่วนหลังที่ต้องทำ (เช่นคำขอสร้างรายงานที่เปลี่ยนเส้นทางไปยังหน้าสถานะการสร้างรายงานในขณะที่ยังคงสร้างรายงานในพื้นหลัง)
Mark Cidade

บางคนสามารถอธิบายสถานการณ์ที่เป็นประโยชน์สำหรับ PageParser.GetCompiledPageInstance (.. ) ได้ไหม เอกสารบอกว่ามันใช้สำหรับการใช้งานโครงสร้างพื้นฐาน - มันส่งคืน IHttpHandler ประเภทดังนั้นฉันไม่เห็นวิธีการใช้งานจริง
John K

@jdk: ฉันเคยใช้มาก่อนในการเอาชนะ handler เริ่มต้นสำหรับการร้องขอ * .aspx ดังนั้นฉันจึงสามารถใช้วัตถุ IHttpHandler ในหน่วยความจำแบบไดนามิก แต่ยังใช้ GetCompiledPageInstance () สำหรับไฟล์กายภาพ * .aspx
Mark Cidade

70

โหมดการค้าปลีกที่ระดับเครื่อง machine:

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

แทนที่การตั้งค่า web.config เพื่อบังคับใช้การดีบักเป็นเท็จเปิดข้อผิดพลาดที่กำหนดเองและปิดใช้งานการติดตาม ไม่ลืมที่จะเปลี่ยนคุณลักษณะก่อนเผยแพร่ - ปล่อยให้พวกเขาทั้งหมดกำหนดค่าสำหรับการพัฒนาหรือทดสอบสภาพแวดล้อมและปรับปรุงการตั้งค่าการค้าปลีก


1
บางครั้งฉันลืมเปลี่ยน debug การคอมไพล์เป็น false ก่อนการเผยแพร่ซึ่งส่งผลเสียต่อประสิทธิภาพการทำงาน ไม่มีปัญหาอีกต่อไป!
Roy Tinker

59

การเปิดใช้งานIntelliSense สำหรับ MasterPagesในหน้าเนื้อหา
ฉันมั่นใจว่านี่เป็นแฮ็คที่รู้จักกันน้อยมาก

เวลาส่วนใหญ่ที่คุณต้องใช้วิธีการค้นหาและควบคุมการควบคุมในหน้าต้นแบบจากหน้าเนื้อหาเมื่อคุณต้องการที่จะใช้ คำสั่งMasterTypeจะเปิดใช้งาน Intellisense ใน Visual Studio เมื่อคุณทำสิ่งนี้

เพียงเพิ่มคำสั่งอีกหนึ่งคำในหน้า

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

หากคุณไม่ต้องการใช้เส้นทางเสมือนและใช้ชื่อคลาสแทน

<%@ MasterType TypeName="MyMainMasterPage" %>

รับบทความเต็มได้ที่นี่


การใช้ FindControl บางครั้งอาจวุ่นวายขอบคุณสำหรับเคล็ดลับที่ยอดเยี่ยมนี้!
Alexandre Brisebois

4
การใช้สิ่งนี้อาจส่งผลให้เกิดพฤติกรรมที่ไม่คาดคิด ดูstackoverflow.com/questions/1998931/…
citronas

โดยส่วนตัวแล้วฉันคิดว่าฟีเจอร์นี้ควรเป็นที่คนอื่นไม่รู้จัก หากคุณจบลงด้วยการใช้คุณสมบัติ / วิธีการของหน้าต้นแบบแล้วเปลี่ยนหน้าต้นแบบที่คุณต้องการด้วยฝันร้าย
Phill

@Phil: บางครั้งก็มีความจำเป็นและการเข้าถึงการพิมพ์หน้าหลักแบบคงที่ดีกว่าวิธี FindControl อย่างน้อยคุณจะได้รับข้อความของผู้รวบรวมและสามารถแก้ไขได้
Durden81

58

HttpContext.Items เป็นเครื่องมือแคชระดับคำขอ


2
นี่จะเป็นประเด็นของฉันเช่นกันฉันใช้สิ่งนี้ในส่วนควบคุมแบบซ้อนเพื่อส่ง / รับข้อมูลระดับคำขอ ฉันยังใช้สิ่งนี้ใน MVC เพื่อจัดเก็บรายการไฟล์ js เพื่อต่อท้ายโดยอิงตามมุมมองบางส่วน
Tracker1

1
ฉันใช้สิ่งนี้เมื่อฉันใช้การกำหนดเส้นทาง asp.net เพื่อส่งผ่านพารามิเตอร์ที่ดึงมาจาก URL ไปยังหน้าของฉัน (ไม่ใช่กับ MVC) ยอดเยี่ยมสำหรับการเขียน url ใหม่และค่อนข้างยืดหยุ่น
Alexandre Brisebois

อืมแค่คิดว่าจะใช้ที่ไหนซักแห่งแทน Session - ta!
Mike Kingscott

52

สองสิ่งที่โดดเด่นในหัวของฉัน:

1) คุณสามารถเปิดและปิดการติดตามจากรหัส:

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

2) คุณสามารถสร้างหน้า. aspx หลายหน้าโดยใช้ไฟล์ "behind รหัส" ที่แชร์เพียงไฟล์เดียว

สร้างหนึ่งไฟล์. cs คลาส:

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

และจากนั้นคุณสามารถมีเพจ. aspx จำนวนเท่าใดก็ได้ (หลังจากคุณลบ. designer.cs และ. cs-behind โค้ดที่ 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>

คุณสามารถมีตัวควบคุมใน ASPX ที่ไม่ปรากฏใน Class1 และในทางกลับกัน แต่คุณต้องจำเพื่อตรวจสอบการควบคุมของคุณเป็นโมฆะ


ฉันน่าจะโหวตสิ่งนี้ แต่ไม่ได้คะแนน ฉันจะพยายามและจำไว้ว่าจะกลับมาลงคะแนนนี้ ฉันไม่รู้ว่าเราสามารถมีไฟล์ Code Behind ได้หลายหน้า ไม่แน่ใจว่ามันจะทำงานอย่างไร
Vaibhav

5
ไม่มีใครคิดว่าเป็นความเสี่ยงด้านความปลอดภัยเพื่อให้คุณสามารถเปิดใช้งานการติดตามจาก URL หรือไม่? (# 1) ฉันจะไม่ลงคะแนนคำถามนี้ แต่สำคัญที่ต้องเข้าใจความเสี่ยงที่นั่น
Kevin Goff

5
แน่นอนคุณควรใส่รหัสนั้นใน #ifdef DEBUG
#endif

ความคิดเห็นที่ดีชี้ให้เห็นด้านความปลอดภัย
Vaibhav

2
เหตุใดจึงมีความเสี่ยงด้านความปลอดภัยในการเปิดใช้งานการติดตามจาก url มันจะถูกใช้เพื่อทำร้ายฉันได้อย่างไร?
Kamarey

48

คุณสามารถใช้ได้:

 Request.Params[Control.UniqueId] 

ที่จะได้รับค่าของการควบคุมก่อนที่จะ viewstate เริ่มต้น (การควบคุม Text ฯลฯ จะว่างเปล่า ณ จุดนี้)

สิ่งนี้มีประโยชน์สำหรับรหัสใน Init


การกำหนดค่าเริ่มต้นของ Viewstate ไม่ได้ใช้ Request.Params ใช้ก่อนเพิ่มวิธี LoadPostData ของการควบคุมที่ใช้ IPostBackDataHandler
chapluck

46

WebMethods

คุณสามารถใช้การเรียกกลับ ASP.NET AJAX กับวิธีการทางเว็บที่วางไว้ในหน้า ASPX คุณสามารถตกแต่งวิธีการคงที่ด้วยแอตทริบิวต์ [WebMethod ()] และ [ScriptMethod ()] ตัวอย่างเช่น:

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

ตอนนี้ในหน้า ASPX ของคุณคุณสามารถทำได้:

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

และเรียกใช้วิธีฝั่งเซิร์ฟเวอร์ของคุณผ่าน JavaScript โดยใช้:

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

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

45

ตรวจสอบว่าไคลเอ็นต์ยังคงเชื่อมต่ออยู่หรือไม่ก่อนเริ่มงานที่รันนาน:

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

44

หนึ่งในคุณสมบัติที่ไม่ค่อยเป็นที่รู้จักและไม่ค่อยได้ใช้ของ ASP.NET คือ

การจับคู่แท็ก

มันไม่ค่อยได้ใช้เพราะมีเพียงสถานการณ์ที่เฉพาะเจาะจงที่คุณจะต้องมัน แต่เมื่อคุณต้องการมันก็เพื่อให้มีประโยชน์

บางบทความเกี่ยวกับคุณสมบัติรู้น้อยนี้:

การแมปแท็กใน ASP.NET
โดยใช้การแม็พแท็กใน ASP.NET 2.0

และจากบทความล่าสุดที่:

การทำแผนที่แท็กช่วยให้คุณสามารถแลกเปลี่ยนการควบคุมที่เข้ากันได้ในเวลารวบรวมในทุกหน้าในเว็บแอปพลิเคชันของคุณ ตัวอย่างที่มีประโยชน์คือถ้าคุณมีตัวควบคุม ASP.NET หุ้นเช่น DropDownList และคุณต้องการแทนที่ด้วยตัวควบคุมแบบกำหนดเองที่ได้รับมาจาก DropDownList นี่อาจเป็นตัวควบคุมที่ได้รับการปรับแต่งเพื่อมอบแคชการค้นหาข้อมูลที่เหมาะสมที่สุด แทนที่จะแก้ไขทุกรูปแบบเว็บและแทนที่ DropDownLists ที่สร้างขึ้นด้วยรุ่นที่กำหนดเองของคุณคุณสามารถให้ ASP.NET มีผลสำหรับคุณโดยแก้ไข web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

นี่จะสร้างความสับสนให้กับนักพัฒนาคนอื่น ๆ ในทีมของคุณ
Aykut Akıncı

1
@Aykut - อาจเป็นไปได้ว่าทำไมฉันถึงบอกว่าประโยชน์ของมันค่อนข้างแคบ แต่เมื่อจำเป็นต้องใช้มันมีประโยชน์มาก นอกจากนี้ฉันจะตรวจสอบให้แน่ใจว่ามีการบันทึกการใช้งานการทำแผนที่อย่างชัดเจนเพื่อหลีกเลี่ยงความสับสนและความกำกวม
CraigTP

43

HttpModules สถาปัตยกรรมที่สง่างามบ้าคลั่ง อาจจะไม่ใช่คุณสมบัติที่ซ่อนอยู่


3
HttpModules เป็นสิ่งที่ก้าวหน้า แต่ฉันจะไม่เรียกมันว่าไม่ค่อยมีคนใช้หรือน้อยกว่า (หรือเรียกฉันว่าไร้เดียงสา) แต่ใช่ฉันรักสถาปัตยกรรม
Vaibhav

+1 เนื่องจากผู้พัฒนาที่มีประสบการณ์มากมายอาจรู้เกี่ยวกับ HttpModules แต่ไม่เข้าใจความสัมพันธ์กับคำขออย่างสมบูรณ์ (สิ่งเดียวกันกับ HttpHandlers)
John Bubriski

34

คุณสามารถใช้ความคิดเห็น ASP.NET ภายในหน้า. aspx เพื่อแสดงความคิดเห็นส่วนเต็มของหน้ารวมถึงการควบคุมเซิร์ฟเวอร์ และเนื้อหาที่ถูกคอมเม้นท์จะไม่ถูกส่งไปยังลูกค้า

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

5
มีคนที่ไม่รู้จริง ๆ ว่ามีความคิดเห็นหรือไม่?
Joe Phillips

7
ผมชอบมันเมื่อคุณพบว่าครึ่งหน้า aspx ใน <! - แสดงความคิดเห็น ...
ไบรอัน Rehbein

มันค่อนข้างคุณลักษณะเปลือยของ ASP.NET
rafek

34

ตัวสร้างนิพจน์รหัส

ตัวอย่างมาร์กอัป:

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

ความงามที่แท้จริงของตัวสร้างนิพจน์รหัสคือคุณสามารถใช้ databinding เช่นการแสดงออกในสถานการณ์ที่ไม่ได้ทำข้อมูล คุณยังสามารถสร้างผู้สร้างนิพจน์อื่นที่ทำหน้าที่อื่นได้

web.config:

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

คลาส cs ที่ทำให้เกิดขึ้นทั้งหมด:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

1
คุณหมายถึงอะไรกับ "และคนอื่น ๆ " ในชื่อ?
เลด Musaied

ฉันเดาว่าฉันไม่เคยไปหาคนอื่น
andleer

2
+1, คุณสมบัติเจ๋งจริง ๆ ... ที่จริงแล้วค่อนข้างคล้ายกับส่วนขยายมาร์กอัปของ WPF
Thomas Levesque

สิ่งนี้ไม่เหมือนกับการใช้งาน<%= /*code*/ %>หรือ
bevacqua

33

การใช้ประเภทไฟล์ ASHX:
หากคุณต้องการเพียงแค่เอาท์พุท html หรือ xml แบบพื้นฐานโดยไม่ต้องผ่านตัวจัดการเหตุการณ์ของเพจคุณสามารถใช้ HttpModule ในแบบง่าย ๆ

ตั้งชื่อหน้าเป็น SomeHandlerPage.ashx และใส่รหัสด้านล่าง (เพียงหนึ่งบรรทัด) ลงไป

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

จากนั้นไฟล์รหัส

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

5
เป็นที่น่าสังเกตว่าคุณควรเพิ่ม IRequiresSessionState หรือ IReadOnlySessionState หากคุณต้องการไม่เช่นนั้นจะไม่อยู่ที่นั่น
Tracker1

3
นอกจากนี้ยังเป็นที่น่าสังเกตว่าคุณสามารถระบุการตั้งค่าตัวจัดการใน web.config ได้ดังนั้นคุณไม่จำเป็นต้องมีไฟล์ Ashx จริงวางอยู่ หรือคุณสามารถลงทะเบียนตัวจัดการโดยทางโปรแกรมในแอปพลิเคชันของคุณเริ่มต้นใน asax ระดับโลก
Phill

27

การตั้งค่าการควบคุมคุณสมบัติของเซิร์ฟเวอร์บนพื้นฐานของเบราว์เซอร์เป้าหมายและอื่น ๆ อีกมากมาย

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

นั่นเป็นสิ่งที่ทำให้ฉันประหลาดใจ


1
+1 คุณสามารถโพสต์ตัวอย่างโค้ดแบบอินไลน์ได้หรือไม่ ฉันคิดว่ามันจะสร้างความสนใจและ upvotes มากขึ้น ฉันต้องการอันนี้ขึ้น
John K


26

ฉันทำงานกับแอพพลิเคชั่น asp.net ซึ่งผ่านการตรวจสอบความปลอดภัยโดย บริษัท รักษาความปลอดภัยชั้นนำและฉันได้เรียนรู้เคล็ดลับง่ายๆนี้เพื่อป้องกันช่องโหว่ความปลอดภัยที่รู้จักน้อย แต่มีความสำคัญ

คำอธิบายด้านล่างมาจาก: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

พิจารณาใช้ Page.ViewStateUserKey เพื่อตอบโต้การโจมตีด้วยคลิกเดียว หากคุณรับรองความถูกต้องของผู้โทรและใช้ ViewState ให้ตั้งค่าคุณสมบัติ Page.ViewStateUserKey ในตัวจัดการเหตุการณ์ Page_Init เพื่อป้องกันการโจมตีด้วยคลิกเดียว

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

ตั้งค่าคุณสมบัติเป็นค่าที่คุณทราบว่าไม่ซ้ำกันสำหรับผู้ใช้แต่ละคนเช่นรหัสเซสชันชื่อผู้ใช้หรือตัวระบุผู้ใช้

การโจมตีแบบคลิกเดียวเกิดขึ้นเมื่อผู้โจมตีสร้างเว็บเพจ (.htm หรือ. aspx) ที่มีเขตข้อมูลฟอร์มที่ซ่อนชื่อ __VIEWSTATE ซึ่งเต็มไปด้วยข้อมูล ViewState แล้ว ViewState สามารถสร้างได้จากหน้าเว็บที่ผู้โจมตีสร้างขึ้นก่อนหน้านี้เช่นหน้าตะกร้าสินค้าที่มี 100 รายการ ผู้โจมตีจะล่อลวงผู้ใช้ที่ไม่สงสัยในการเรียกดูหน้าเว็บจากนั้นผู้โจมตีจะทำให้หน้านั้นถูกส่งไปยังเซิร์ฟเวอร์ที่ ViewState นั้นถูกต้อง เซิร์ฟเวอร์ไม่มีทางรู้ได้ว่า ViewState มีต้นกำเนิดมาจากผู้โจมตี การตรวจสอบ ViewState และ HMAC ไม่ตอบโต้การโจมตีนี้เนื่องจาก ViewState นั้นถูกต้องและเพจนั้นจะถูกดำเนินการภายใต้บริบทความปลอดภัยของผู้ใช้

โดยการตั้งค่าคุณสมบัติ ViewStateUserKey เมื่อผู้โจมตีเรียกดูไปยังเพจเพื่อสร้าง ViewState คุณสมบัติจะถูกเริ่มต้นเป็นชื่อของเขาหรือเธอ เมื่อผู้ใช้ถูกต้องตามกฎหมายส่งหน้าไปยังเซิร์ฟเวอร์ก็จะเริ่มต้นด้วยชื่อของผู้โจมตี ดังนั้นการตรวจสอบ ViewState HMAC จึงล้มเหลวและมีการสร้างข้อยกเว้น


2
นอกจากนี้อย่าลืมออกจาก baseInInit (e); เพื่อให้ฟังก์ชัน Page_Init () ทำงานได้
Druid

ฉันคิดว่าเคล็ดลับนี้อาจล้มเหลวหากผู้ใช้จริงไม่ยอมรับคุกกี้หรือหาก sessionid หมดเวลา
Aristos

1
คุณไม่จำเป็นbase.OnInit(e);ถ้าคุณใช้AutoEventWireup="true"สำหรับหน้า
Adam Nofsinger

1
ดรูอิด: เขาไม่ได้เอาชนะ OnInit (ซึ่งในกรณีนี้จำเป็นต้องมี base.Benit (e))
crdx

การใช้ ID เซสชันสำหรับ ViewStateUserKey จะทำงานหลังจากที่เริ่มเซสชันจริง นอกจากนี้ยังหมายความว่าหน้าเหล่านี้สามารถหมดเวลาได้หลังจากเซสชันหมดอายุ ในกรณีที่ปัญหาเหล่านั้นเป็นปัญหาคุณอาจพิจารณาใช้สิ่งที่คงทนกว่าเช่นที่อยู่ IP ของผู้ใช้
RickNZ

25

HttpContext.Current.IsDebuggingEnabled

นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับการกำหนดว่าสคริปต์ใดที่จะส่งออก (ต่ำสุดหรือเวอร์ชันเต็ม) หรือสิ่งอื่นใดที่คุณอาจต้องการใน dev แต่ไม่ได้ใช้งานอยู่


ฉันเห็นด้วยกับแจน แต่บางครั้งมันก็น่าสนใจที่จะมีแอพที่ตระหนักถึงสถานะการทำงานของ Debug / Release
Alexandre Brisebois

20

รวมอยู่ใน ASP.NET 3.5 SP1:

  • ตอนนี้ customErrors สนับสนุนแอตทริบิวต์ "redirectMode" ด้วยค่าของ "ResponseRewrite" แสดงหน้าข้อผิดพลาดโดยไม่ต้องเปลี่ยน URL
  • ตอนนี้แท็กแบบฟอร์มจะรับรู้คุณลักษณะการดำเนินการ ยอดเยี่ยมเมื่อคุณใช้การเขียน URL ใหม่

20

DefaultButtonคุณสมบัติในแผง

มันตั้งปุ่มเริ่มต้นสำหรับแผงเฉพาะ


1
ความสนใจใช้ไม่ได้กับปุ่มทุกชนิดเช่น LinkButtons!
Kovu


19

การใช้ configSource เพื่อแยกไฟล์การกำหนดค่า

คุณสามารถใช้แอตทริบิวต์ configSource ในไฟล์ web.config เพื่อส่งองค์ประกอบการกำหนดค่าไปยังไฟล์. config อื่น ๆ แทน:

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

... คุณสามารถเก็บส่วนการตั้งค่าแอปทั้งหมดไว้ในไฟล์กำหนดค่าอื่นได้ นี่คือใหม่web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.configไฟล์:

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

สิ่งนี้มีประโยชน์มากสำหรับสถานการณ์ที่คุณปรับใช้แอปพลิเคชันให้กับลูกค้าและคุณไม่ต้องการให้พวกเขารบกวนไฟล์ web.config และต้องการให้พวกเขาสามารถเปลี่ยนการตั้งค่าได้เพียงไม่กี่อย่าง

อ้างอิง: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx


1
นอกจากนี้ยังทำงานกับ. net ทุกประเภทเช่นแอปเดสก์ท็อป configs
Zoltan Veres

17

แอตทริบิวต์MaintainScrollPositionOnPostbackใน Page directive มันถูกใช้เพื่อรักษาตำแหน่งการเลื่อนของหน้า aspx ข้าม postbacks


1
ความคิดเห็นจะเป็นประโยชน์ในการปรับปรุงคำตอบ
MRG


16

โดยค่าเริ่มต้นเนื้อหาใด ๆ ระหว่างแท็กสำหรับตัวควบคุมแบบกำหนดเองจะถูกเพิ่มเป็นตัวควบคุมลูก สิ่งนี้สามารถดักจับในการแทนที่ AddParsedSubObject ()สำหรับการกรองหรือการแยกวิเคราะห์เพิ่มเติม (เช่นเนื้อหาข้อความใน 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>

13

หากคุณมี ASP.NET สร้างฟีด RSS บางครั้งมันจะวางบรรทัดพิเศษไว้ที่ด้านบนของหน้า สิ่งนี้จะไม่ตรวจสอบกับตัวตรวจสอบความถูกต้อง RSS ทั่วไป คุณสามารถแก้ไขได้โดยวางคำสั่งหน้า<@Page>ไว้ที่ด้านล่างของหน้า


7
คุณจะทำได้ดีกว่าถ้าใช้ตัวจัดการ .ASHX เพื่อสร้างฟีด RSS หรือไม่
Dan Diplo

ฉันเดาว่าขึ้นอยู่กับความซับซ้อนของโครงการ ไม่ใช่ทุกคนที่มีความสามารถหรือทักษะในการสร้างและรวบรวมตัวจัดการ ในหน้า asp.net ใช้งานได้ดีพอสมควรสำหรับเรื่องนี้
Kevin Goff

1
และคุณสามารถใช้บางอย่างเช่น <asp: Repeater> เพื่อสร้างรายการ RSS และใช้เทคนิคอื่น ๆ (เช่นการใช้ LogInView เพื่อลบบางรายการ) ซึ่งดีกว่าการเขียนสตริงจาก ASHX IMO มาก
chakrit

LinqToXml + ASHX เป็นวิธีที่จะไป!
Carlos Muñoz

สิ่งนี้มีประโยชน์มากกว่าการสร้างฟีด RSS IIRC, HTML5 ต้องมีแท็ก <! doctype html> ในบรรทัดแรกที่ด้านบนเพื่อตรวจสอบความถูกต้อง
Roy Tinker

12

ก่อนที่จะเพิ่มเส้นทาง ASP.NET v3.5 คุณสามารถสร้าง URL ที่เป็นมิตรของคุณเองได้ง่ายๆโดยการเขียน HTTPModule ไปที่และเขียนคำขอใหม่ในขั้นตอนแรกของขั้นตอนหน้า (เช่นเหตุการณ์ BeginRequest)

URL เช่นhttp: // servername / page / Param1 / SomeParams1 / Param2 / SomeParams2จะถูกแมปไปยังหน้าอื่นเช่นด้านล่าง (มักใช้นิพจน์ทั่วไป)

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

DotNetNuke มี HttpModule ที่ดีมากที่ทำสิ่งนี้เพื่อ URL ที่เป็นมิตรของพวกเขา ยังคงมีประโยชน์สำหรับเครื่องที่คุณไม่สามารถใช้. NET v3.5


สิ่งนี้ต้องการการแมปคำขอ IIS ทั้งหมดกับ ASP.NET
John Sheehan

หรือเพียงแค่จัดการข้อผิดพลาด 404
FlySwat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.