Programing

ASP.NET의 숨겨진 기능

lottogame 2020. 3. 18. 07:59
반응형

ASP.NET의 숨겨진 기능


이 질문은 역사적 의미가 있기 때문에 존재하지만이 사이트에 대해서는 좋은 주제로 간주 되지 않으므로 여기에서 비슷한 질문을 할 수 있다는 증거로 사용하지 마십시오.

자세한 정보 : https://stackoverflow.com/faq


프린지 (fringe) 시나리오에 유용한 기능은 항상 있지만 그 이유 때문에 대부분의 사람들은이를 알지 못합니다. 나는 일반적으로 교과서에서 가르치지 않는 기능을 요구하고 있습니다.

당신이 아는 것은 무엇입니까?


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

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

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

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

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


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

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


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

<compilation optimizeCompilations="true">

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

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

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

여기를 통해 :


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

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

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

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


machine.config 레벨의 소매 모드 :

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

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


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

대부분의 경우 findcontrol 메소드를 사용하고 원하는 컨텐츠 페이지에서 마스터 페이지의 제어를 캐스트 해야하는 경우 MasterType 지시문은 일단 Visual Studio에서 인텔리전스 를 활성화합니다.

페이지에 지시문을 하나 더 추가하십시오.

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

가상 경로를 사용하지 않고 클래스 이름을 대신 사용하려면

<%@ MasterType TypeName="MyMainMasterPage" %>

전체 기사를 여기에서 얻으십시오


요청 수준 캐싱 도구 인 HttpContext.Items


내 머리 속에 두 가지가 눈에 stand 다.

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이 있는지 확인하려면 기억해야합니다.


당신이 사용할 수있는:

 Request.Params[Control.UniqueId] 

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

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


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>

장기 실행 작업을 시작하기 전에 클라이언트가 여전히 연결되어 있는지 확인하십시오.

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

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>

HttpModules . 건축은 미친 듯이 우아하다. 숨겨진 기능은 아니지만 그다지 멋진 것은 아닙니다.


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

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

코드 표현식 빌더

샘플 마크 업 :

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

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

대상 브라우저에 서버 컨트롤 속성 기반 설정 .

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

그 중 하나가 나를 놀라게했다.


System.Web.VirtualPathUtility


나는 주요 보안 회사의 보안 감사를 거친 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 검사가 실패하고 예외가 생성됩니다.


HttpContext.Current.IsDebuggingEnabled

출력 할 스크립트 (최소 또는 정식 버전) 또는 개발자가 원하지만 실행하지 않을 스크립트를 결정하는 데 유용합니다.


ASP.NET 3.5 SP1에 포함 :

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

패널의 DefaultButton 속성

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


ScottGu는 http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx에 많은 트릭을 가지고 있습니다 .


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


페이지 지시문의 MaintainScrollPositionOnPostback 속성 포스트 백에서 aspx 페이지의 스크롤 위치를 유지하는 데 사용됩니다.


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


기본적으로 사용자 지정 컨트롤의 태그 사이에있는 모든 콘텐츠는 자식 컨트롤로 추가됩니다. 필터링 또는 추가 구문 분석 (예 : 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>

ASP.NET에서 RSS 피드를 생성하는 경우 페이지 상단에 여분의 줄이 추가 될 수 있습니다. 일반적인 RSS 유효성 검사기를 사용하여 유효성을 검사하지는 않습니다. 페이지 지시문 <@Page>페이지 맨 아래 에 배치하여이 문제를 해결할 수 있습니다 .


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를 배포 할 수없는 컴퓨터에 여전히 유용합니다.

참고 URL : https://stackoverflow.com/questions/54929/hidden-features-of-asp-net

반응형