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/… 및 관련 메타 게시물을 참조하십시오 .

답변:


335

테스트하는 동안 SMTP 서버 대신 컴퓨터의 폴더로 이메일을 보낼 수 있습니다. 이것을 web.config에 넣으십시오.

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

6
정말? Dumbster와 같은 가짜 SMTP 서버를 설치하려고했습니다. 보석을 숨겼습니다.
Eduardo Molteni 2018 년

2
디렉토리 위치에 UNC 공유를 지정할 수 있는지 아는 사람이 있습니까?
Mark Sherretta

32
더 나은 방법은 이것을 dev box machine.config에 넣으면 만드는 모든 앱에서 web.config를 변경할 필요가 없다는 것입니다.
Max Toro

로컬 호스트에서만 작동하도록 설정할 수 있습니까? 그렇게하면 매번 변경할 필요가 없습니까?
chobo2 2009

이에 대한 설정이 없습니다. 다른 방법 (웹 배포 프로젝트, 빌드 작업 등)을 사용하여 구성 차이를 관리해야합니다.
John Sheehan

210

app_offline.htm 이라는 파일을 웹 응용 프로그램 디렉터리의 루트에 배치하면 ASP.NET 2.0+는 응용 프로그램을 종료하고 해당 응용 프로그램에 대한 새로운 들어오는 요청의 처리를 중지하고 app_offline.htm의 내용 만 표시합니다. 모든 새로운 요청에 대한 파일 .

변경 사항을 프로덕션 서버에 다시 배포 (또는 롤백)하는 동안 "일시적으로 사용할 수 없음"알림을 표시하는 가장 빠르고 쉬운 방법입니다.

또한 marxidad가 지적했듯이 IE6이 올바르게 렌더링 할 수 있도록 파일 내에 최소한 512 바이트의 내용이 있는지 확인하십시오.


10
: IE의 "친절한"메시지에 대한 해결 방법 잊지 마세요 tinyurl.com/app-offline-friendly
마크시다

1
아야! MOSS 2007과 함께 사용할 때주의하십시오. 마지막 IIS 재시작 이후에 액세스 한 페이지에 대해서만 작동합니다. 따라서이 페이지를 wss 가상 루트에 추가 한 다음 이전에 액세스하지 않은 페이지를 열려고하면 404가 표시됩니다.
Marc

1
@Marc-Scott Guthrie에서이 팁을 얻었습니다. 관대하다고 느끼면 Gu의 기사에 대해 언급 한 경우 weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun 2016 년

또한 모든 요청이 완료된 후 앱 도메인이 재활용되고 열려있는 데이터베이스 연결이 닫힙니다.
Bart Verkoeijen

IIS에는 HTTP 상태 코드가 404 인 app_offline.htm 콘텐츠가 반환됩니다.이 오프라인 모드에있을 때 검색 엔진이 돌아 다니면서 사이트 색인을 생성하려는 경우 결과에 만족하지 못할 수 있습니다. 그러나 그것은 내 개인 회사 웹 앱에 훌륭하게 작동합니다!
Larry Silverman

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

이것은 customErrors 페이지를 반환하는 ASP.NET에 의해 포착됩니다. 최근 .NET Tip of the Day Post 에서 이것에 대해 배웠습니다.


일부 개발자는 .NET 서적에서 상당히 비싼 작업 인 예외를 throw하는 대신 HttpContext.Response에서 수동으로 처리하는 것이 더 낫다고 주장 할 수 있습니다.
lubos hasko

이 나쁜 형태 아닌가요? 404 오류가 표시되는 반면 오류 / 예외를 표시하려고합니다.
Donnie Thomas

1
내가 생각할 수있는 한 가지 사례는 누군가가 매개 변수를 악의적으로 엉망으로 만들고 잘못된 것을 넣는 경우 특정 오류가 아닌 일반 404를 원할 것입니다.
존 시핸

3
.NET Tip of the Day 사이트를 알고 있기 때문에 순전히 찬성했습니다.
Kon

당신이 httpModule이 나 HttpHandler를에 던져 경우에만 작동합니다
칼레드 Musaied

75

여기 가장 좋은 것이 있습니다. 빠른 컴파일을 위해 web.config에 추가하십시오. 이것은 이 QFE 를 통해 3.5SP1 이후 입니다.

<compilation optimizeCompilations="true">

빠른 요약 : 일부 시나리오에서 컴파일 속도를 크게 향상시킬 수있는 새로운 optimizeCompilations 스위치를 ASP.NET에 도입했습니다. 잡기가 있기 때문에 자세한 내용을 읽으십시오. 이 스위치는 현재 3.5SP1에 대한 QFE로 제공되며 VS 2010에 포함됩니다.

ASP.NET 컴파일 시스템은 '최상위'파일이 변경 될 때마다 수행했던 이전 작업을 모두 지우는 매우 보수적 인 접근 방식을 취합니다. '최상위 레벨'파일에는 bin. App_Code 및 global.asax의 모든 항목이 포함됩니다. 작은 앱에서는 제대로 작동하지만 매우 큰 앱에서는 거의 사용할 수 없습니다. 예를 들어 고객이 '빈'어셈블리를 변경 한 후 페이지를 새로 고치는 데 10 분이 걸리는 경우가있었습니다.

고통을 덜기 위해 재 컴파일에 훨씬 덜 보수적 인 접근 방식을 취하는 '최적화 된'컴파일 모드를 추가했습니다.

여기를 통해 :


6
VS 2010에서 "기본적으로 설정되어 있습니까"아니면 여전히 사용해 봐야합니까?
M4N

73
  • HttpContext.Current 는 페이지의 속성에 액세스 할 수없는 경우에도 (예 : 느슨하게 연결된 도우미 클래스에서) 현재 컨텍스트의 요청 / 응답 등에 액세스 할 수 있도록합니다.

  • Response.Redirect ( url , false )를 호출하여 사용자를 다른 페이지로 리디렉션 한 후 동일한 페이지에서 코드를 계속 실행할 수 있습니다.

  • 컴파일 된 페이지 (또는 IHttpHandler ) 만 있으면 .ASPX 파일이 필요하지 않습니다 . web.config 파일 의 요소 에서 클래스를 가리 키도록 경로 및 HTTP 메소드를 설정 하십시오.<httpHandlers>

  • 페이지 오브젝트가에서 검색 할 수 .ASPX의 프로그램 호출 파일 PageParser.GetCompiledPageInstance을 (virtualPath, aspxFileName 컨텍스트)


Response.Redirect (url, false)에 대하여-그것은 내가 오랫동안 기대했던 것입니다 .. 나는 그것을 놓친 방법을 모르겠지만 thanxxx
Subliminal Hash

1
누군가 당신이 이것으로 무엇을 할 것인지 설명 할 수 있습니까? 나는 그것이 가치가 있다는 것을 안다. 그러나 나는 왜 그런지 알 수 없다.
Deane

5
사용자를 다른 주소로 리디렉션하려고하지만 여전히 백엔드 처리가 필요한 경우 (예 : 백그라운드에서 보고서를 계속 생성하면서 보고서의 생성 상태 페이지로 리디렉션되는 보고서 생성 요청)
Mark Cidade

누군가가 PageParser.GetCompiledPageInstance (..)의 유용한 상황을 설명 할 수 있습니까? 문서는 인프라 사용을위한 것이라고 말합니다 .IHttpHandler 유형을 반환하므로 실제로 어떻게 사용할 수 있는지 알 수 없습니다.
John K

@jdk : 과거에 * .aspx 요청에 대한 기본 처리기를 재정의 할 때 동적 메모리 내 IHttpHandler 개체를 사용할 수 있지만 실제 * .aspx 파일에는 GetCompiledPageInstance ()를 사용할 수 있습니다.
Mark Cidade

70

machine.config 레벨의 소매 모드 :

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

web.config 설정을 재정 의하여 디버그를 false로 적용하고 사용자 지정 오류를 설정하고 추적을 비활성화합니다. 게시하기 전에 속성을 변경하는 것을 더 이상 잊지 마십시오. 모든 속성을 개발 또는 테스트 환경에 맞게 구성하고 프로덕션 소매 설정을 업데이트하십시오.


1
때로는 게시하기 전에 컴파일 디버그를 false로 변경하는 것을 잊어 버려 성능에 부정적인 영향을 미칩니다. 더 이상 문제 없습니다!
Roy Tinker

59

사용 MasterPages에 대한 인텔리을 컨텐츠 페이지에서
나는 확실히 이것은 매우 작은 알려진 해킹은 오전

대부분의 경우 findcontrol 메소드를 사용하고 원하는 컨텐츠 페이지에서 마스터 페이지의 제어를 캐스트 해야하는 경우 MasterType 지시문은 일단 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 파일 목록을 저장합니다.
추적기 1

1
asp.net 라우팅을 사용하여 URL에서 가져온 매개 변수를 내 페이지로 전달할 때 이것을 사용합니다. (MVC 제외) URL 재 작성에 적합하며 매우 유연합니다.
Alexandre Brisebois

흠, 세션 대신 이것을 사용할 수있는 곳을 생각했습니다.
Mike Kingscott

52

내 머릿속에 두 가지가 눈에 : 다.

1) 코드에서 추적을 켜거나 끌 수 있습니다.

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

2) 하나의 공유 "코드 숨김"파일 만 사용하여 여러 .aspx 페이지를 작성할 수 있습니다.

하나의 클래스 .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";
        }
    }

그런 다음 VS가 생성 한 .designer.cs 및 .cs 코드 숨김을 삭제 한 후 .aspx 페이지를 얼마든지 가질 수 있습니다.

  <%@ 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에 나타나지 않는 컨트롤이있을 수 있으며 그 반대도 가능하지만 컨트롤에 null이 있는지 확인하기 위해 기억해야합니다.


나는 이것을 투표했을 것입니다, 그러나 투표가 부족합니다. 나는 이것을 투표하기 위해 다시 오려고 노력할 것이다. 여러 페이지에 대해 동일한 코드 숨김 파일을 가질 수 있다는 것을 몰랐습니다. 확실하지 않습니다, 어떻게 작동할까요.
Vaibhav

5
다른 사람이 URL에서 추적을 활성화 할 수있는 보안 위험을 생각합니까? (# 1) 나는이 질문을 무시하지는 않을 것이지만, 그 위험을 이해하는 것이 중요합니다.
케빈 고프

5
절대적으로,이 코드를 #ifdef DEBUG #endif 블록
Radu094

보안 측면을 지적하는 훌륭한 의견.
Vaibhav

2
URL에서 추적을 활성화하는 것이 보안 위험 인 이유는 무엇입니까? 어떻게 해를 입힐 수 있습니까?
Kamarey

48

당신이 사용할 수있는:

 Request.Params[Control.UniqueId] 

viewstate가 초기화되기 전에 컨트롤의 값을 얻으려면 (이 시점에서 Control.Text 등이 비어 있습니다).

이것은 Init의 코드에 유용합니다.


Viewstate 초기화는 Request.Params로 처리되지 않습니다. 제어 구현 IPostBackDataHandler의 LoadPostData 메소드를 발생시키기 전에이를 사용하십시오.
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 2.0에서 태그 매핑을 사용하여 ASP.NET에서
태그 매핑

그리고 마지막 기사에서 :

태그 매핑을 사용하면 웹 응용 프로그램의 모든 페이지에서 컴파일 타임에 호환 가능한 컨트롤을 바꿀 수 있습니다. 유용한 예는 DropDownList와 같은 기본 ASP.NET 컨트롤이 있고이를 DropDownList에서 파생 된 사용자 지정 컨트롤로 바꾸려는 경우입니다. 조회 데이터를보다 최적화 된 캐싱을 제공하도록 사용자 정의 된 제어 일 수 있습니다. 모든 웹 양식을 편집하고 내장 된 DropDownLists를 사용자 정의 버전으로 바꾸는 대신 web.config를 수정하여 ASP.NET에서 효과적으로 사용할 수 있습니다.

<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

많은 노련한 개발자가 HttpModules에 대해 알고 있지만 요청과의 관계를 완전히 이해하지 못하기 때문에 +1입니다. (HttpHandlers와 동일)
John Bubriski

34

.aspx 페이지에서 ASP.NET 설명을 사용하여 서버 컨트롤을 포함하여 페이지의 전체 부분을 주석 처리 할 수 ​​있습니다. 그리고 주석 처리 된 내용은 클라이언트에게 전송되지 않습니다.

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

코드 표현식 빌더의 진정한 장점은 비 데이터 바인딩 상황에서 표현식과 같은 데이터 바인딩을 사용할 수 있다는 것입니다. 다른 기능을 수행하는 다른 Expression Builder를 만들 수도 있습니다.

web.config :

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

모든 것을 가능하게하는 CSS 클래스 :

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

1
제목에서 "및 기타"는 무엇을 의미합니까?
Khaled 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를 추가해야합니다. 그렇지 않으면 존재하지 않습니다.
추적기 1

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. 짧은 코드 샘플을 인라인으로 게시 할 수 있습니까? 나는 그것이 더 많은 관심을 불러 일으킬 것이라고 생각합니다. 나는 이것 하나가 올라 가기를 원한다.
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_Init 이벤트 처리기에서 Page.ViewStateUserKey 속성을 설정하십시오.

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

속성을 세션 ID, 사용자 이름 또는 사용자 식별자와 같이 각 사용자에게 고유 한 값으로 설정하십시오.

공격자가 이미 ViewState 데이터로 채워진 __VIEWSTATE라는 숨겨진 양식 필드를 포함하는 웹 페이지 (.htm 또는 .aspx)를 만들 때 한 번의 클릭 공격이 발생합니다. ViewState는 공격자가 이전에 만든 페이지 (예 : 100 개의 항목이있는 장바구니 페이지)에서 생성 할 수 있습니다. 공격자는 의심하지 않는 사용자가 페이지를 탐색하도록 유혹 한 다음 ViewState가 유효한 서버로 페이지를 보내 게합니다. 서버는 ViewState가 공격자에서 시작되었음을 알 방법이 없습니다. ViewState가 유효하고 페이지가 사용자의 보안 컨텍스트에서 실행되므로 ViewState 유효성 검사 및 HMAC는이 공격에 대응하지 않습니다.

ViewStateUserKey 속성을 설정하면 공격자가 ViewState를 만들기 위해 페이지를 탐색 할 때 속성이 자신의 이름으로 초기화됩니다. 합법적 인 사용자가 페이지를 서버에 제출하면 공격자의 이름으로 초기화됩니다. 결과적으로 ViewState HMAC 검사가 실패하고 예외가 생성됩니다.


2
또한 base.OnInit (e); Page_Init () 함수가 작업을 수행합니다.
드루이드

실제 사용자가 쿠키를 허용하지 않거나 sessionid에 시간 초과가 있으면이 트릭이 실패 할 수 있다고 생각합니다.
Aristos

1
페이지에 base.OnInit(e);사용 AutoEventWireup="true"중인 경우 필요하지 않습니다 .
Adam Nofsinger

1
드루이드 : 그는 OnInit를 무시하지 않습니다 (이 경우 base.OnInit (e)가 필요합니다).
crdx 2019

ViewStateUserKey에 세션 ID를 사용하면 실제로 세션이 시작된 후에 만 ​​작동합니다. 또한 세션이 만료 된 후 이러한 페이지가 시간 초과 될 수 있음을 의미합니다. 이러한 문제가 우려되는 경우 사용자의 IP 주소와 같이보다 내구성있는 것을 사용하는 것이 좋습니다.
RickNZ


20

ASP.NET 3.5 SP1에 포함 :

  • customErrors는 이제 "ResponseRewrite"값을 가진 "redirectMode"속성을 지원합니다. URL을 변경하지 않고 오류 페이지를 표시합니다.
  • 양식 태그는 이제 action 속성을 인식합니다. URL 재 작성을 사용할 때 적합

20

패널의 DefaultButton 속성

특정 패널의 기본 버튼을 설정합니다.


1
주의 : LinkButtons와 같은 모든 종류의 버튼에서는 작동하지 않습니다!
Kovu


19

configSource를 사용하여 구성 파일 분할

web.config 파일에서 configSource 속성을 사용하여 구성 요소를 다른 .config 파일로 푸시 할 수 있습니다 (예 :

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

... 전체 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 프로젝트, 예를 들어 데스크탑 앱에서 작동합니다. 설정
Zoltan Veres


16

HttpContext.IsCustomErrorEnabled는 멋진 기능입니다. 두 번 이상 유용하다는 것을 알았습니다. 여기에 대한 짧은 게시물 이 있습니다.


16

기본적으로 사용자 지정 컨트롤의 태그 사이에있는 모든 콘텐츠는 자식 컨트롤로 추가됩니다. 필터링 또는 추가 구문 분석 (예 : LiteralControls의 텍스트 내용 ) 을 위해 AddParsedSubObject () 재정의 에서이를 가로 챌 수 있습니다 .

    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
RSS 피드를 생성하기 위해 .ASHX 핸들러를 사용하는 것이 더 좋지 않습니까?
Dan Diplo

나는 그것이 프로젝트의 복잡성에 달려 있다고 생각합니다. 모든 사람이 처리기를 만들고 컴파일 할 수있는 능력이나 기술을 가지고있는 것은 아닙니다. 페이지에서 asp.net이 이에 합리적으로 잘 작동합니다
Kevin Goff

1
<asp : Repeater>와 같은 것을 사용하여 RSS 항목을 생성하고 ASHX IMO에서 문자열을 쓰는 것보다 훨씬 더 나은 다른 트릭 (예 : 일부 항목을 제거하기 위해 LogInView 사용)을 수행 할 수 있습니다
chakrit

LinqToXml + ASHX는 갈 길입니다!
Carlos Muñoz

이는 RSS 피드 생성 이상의 기능에 유용합니다. IIRC, HTML5의 첫 번째 줄에 <! doctype html> 태그가 있어야 올바르게 유효성을 검사 할 수 있습니다.
Roy Tinker

12

ASP.NET v3.5가 경로를 추가하기 전에 HTTPModule을 작성하여 페이지 파이프 라인의 초기에 요청을 다시 작성하기 위해 (예 : BeginRequest 이벤트와 같은) 고유 한 URL을 만들 수있었습니다.

http : // servername / page / Param1 / SomeParams1 / Param2 / SomeParams2 와 같은 URL은 아래와 같은 다른 페이지에 매핑됩니다 (종종 정규식 사용).

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

DotNetNuke는 친숙한 URL을 위해 이것을 수행하는 정말 좋은 HttpModule을 가지고 있습니다. .NET v3.5를 배포 할 수없는 컴퓨터에 여전히 유용합니다.


이것은 ASP.NET에 대한 모든 IIS 요청을 매핑 필요
존 시핸에게

또는 404 오류 처리기입니다.
FlySwat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.