urlMappings요소는 특정 url을 특정 url로 이동 시켜주는 기능을 한다.
웹사이트 호출 시 index.aspx페이지를 호출하면 바로 main/default.aspx페이지로 이동해야 할 경우 아래의 코드와 같이 mappedUrl과 url에 그 값을 넣어줄 수 있다.
<configuration>
  <system.web>
  <urlMappings enabled="true">
     <add url="~/index.aspx" mappedUrl="~/default.aspx"/>
  </urlMappings>
  </system.web>
</configuration>

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
WebDev.WebServer [/port:<port number>] /path:<physical path> [/vpath:<virtual path>]

예)가상 디렉터리 없이 루트에서 서비스 실행하기
start /B webdev.webserver.exe /port:4955 /path:"c:\documents and settings\MMichael\Local Settings\Temp\HelloWorldWebSite"  /vpath:/
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
2006/08/25 14:14
ctlPaging.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ctlPaging.ascx.cs" Inherits="ctlPaging_ascx" %>
<style>
  /*default setting*/
  .Paging A:link {color:#434343;FONT-FAMILY:돋움, arial;FONT-SIZE:9pt;line-height:11pt;text-decoration:none;}
  .Paging A:visited {color:#434343;FONT-FAMILY:돋움, arial;FONT-SIZE:9pt;line-height:11pt;text-decoration:none;}
  .Paging A:active {color:#000000;FONT-FAMILY:돋움, arial;FONT-SIZE:9pt;line-height:11pt;text-decoration:none;}
  .Paging A:hover {color:#FA8406;FONT-FAMILY:돋움, arial;FONT-SIZE:9pt;line-height:11pt;text-decoration:none;}
  }
</style>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
  <tr>
       <td align=center height=30px class=Paging>
           <%=Prev10Btn %>
           <%=PrevBtn %>
           <%=NumList %>
           <%=NextBtn %>
           <%=Next10Btn %>
       </td>
  </tr>
</table>
<input id="PGN" type="hidden" runat=server />


ctlPaging.ascx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class ctlPaging_ascx : System.Web.UI.UserControl
{
  //이전10개 버튼
  public string Prev10Btn = "[<<]";
  //다음10개 버튼
  public string Next10Btn = "[>>]";
  //다음버튼
  public string NextBtn = "[>]";
  //이전버튼
  public string PrevBtn = "[<]";
  //숫자리스트
  public string NumList = string.Empty;
  //한페이지에들어갈 항목 갯수
  public int PageSize = 10;
  //데이터의 총 수
  public int TotalItemCount = 100;
  //현재페이지 번호
  private int CurrentPage = 1;
  //총 페이지 수(TotalItemCount/PageSize)
  private int PageCount = 0;

  protected void Page_Load(object sender, EventArgs e)
  {
       Render_Paging();
       ButtonSetting();
  }
  /// <summary>
  /// 파라미터에서 ?와 &를 적절히 배치하여 유효한 URL을 생성한다.
  /// </summary>
  /// <returns></returns>
  private string NavigationUrl()
  {
       string NaviUrl = Request.Url.ToString();
       if (NaviUrl.IndexOf("?") > -1)
       {
           if (NaviUrl.IndexOf("&PGN") > -1)
           {
               NaviUrl = NaviUrl.Substring(0, NaviUrl.IndexOf("PGN") - 1);
               NaviUrl = NaviUrl + "&PGN=";
           }
           else if (NaviUrl.IndexOf("?PGN") > -1)
           {
               NaviUrl = NaviUrl.Substring(0, NaviUrl.IndexOf("PGN") - 1);
               NaviUrl = NaviUrl + "?PGN=";
           }
           else
           {
               NaviUrl = NaviUrl + "&PGN=";
           }
       }
       else
       {
           NaviUrl = NaviUrl + "?PGN=";
       } 
       return NaviUrl;
  }
  /// <summary>
  /// 페이징 넘버를 출력한다.
  /// </summary>
  private void Render_Paging()
  {
       PageCount = TotalItemCount / PageSize;
       CurrentPage = (Request.Params["PGN"] == null) ? 0 : int.Parse(Request["PGN"]);
       int firstPage = (CurrentPage/10)*10+1;
       int EndPage = (CurrentPage / 10) * 10 + 10;
       if (EndPage > PageCount)
       {
           EndPage = PageCount+1;
       }
       for (int i = firstPage-1; i < EndPage; i++)
       {
           if (CurrentPage == i)
           {
               NumList += "<b>[" + Convert.ToString(i + 1) + "]</b>";
           }
           else
           {
               NumList += "<a href=" + NavigationUrl() + i + ">[" + Convert.ToString(i + 1) + "]</a>";
           }
       }
  }
  /// <summary>
  /// 버튼 세팅
  /// </summary>
  private void ButtonSetting()
  {
       if (CurrentPage >= 10)
           Prev10Btn = "<a href=" + NavigationUrl() + Convert.ToString(((CurrentPage - 10) / 10) * 10) + ">" + Prev10Btn + "</a>";
       else
           Prev10Btn = "<Font Color='#cccccc'>" + Prev10Btn + "</font>";
       if (CurrentPage < (PageCount/10)*10)
           Next10Btn = "<a href=" + NavigationUrl() + Convert.ToString(((CurrentPage + 10) / 10) * 10) + ">" + Next10Btn + "</a>";
       else
           Next10Btn = "<Font Color='#cccccc'>" + Next10Btn + "</font>";
       if (CurrentPage < PageCount)
           NextBtn = "<a href=" + NavigationUrl() + Convert.ToString(CurrentPage + 1) + ">" + NextBtn + "</a>";
       else
           NextBtn = "<Font Color='#cccccc'>" + NextBtn + "</font>";
       if ((CurrentPage - 1) >= 0)
           PrevBtn = "<a href=" + NavigationUrl() + Convert.ToString(CurrentPage - 1) + ">" + PrevBtn + "</a>";
       else
           PrevBtn = "<Font Color='#cccccc'>" + PrevBtn + "</font>";
  }
  /// <summary>
  /// 페이징 쿼리 생성기
  /// </summary>
  /// <param name="topLen">가져올 항목 수</param>
  /// <param name="notinLen">제외할 항목 수</param>
  /// <param name="tableName">테이블 명</param>
  /// <param name="pk">비교할 키</param>
  /// <param name="where">조건절</param>
  /// <returns></returns>
  public string PagingQueryBuilder(int topLen, int notinLen, string tableName, string pk, string where, string order)
  {
       string query = "";
       query += " SELECT TOP " + topLen + " * FROM " + tableName + " WHERE " + pk + " NOT IN ";
       query += " ( ";
       query += " SELECT TOP " + notinLen + " " + pk + " FROM " + tableName + " WHERE " + where + " " + order + " ";
       query += " ) and " + where + " " + order + " ";
      
       return query;
  }
}

사용예제
PGN = (Request.Params["PGN"] == null) ? 0 : int.Parse(Request["PGN"]);

CtlPaging.PageSize = 10;


:::Paging쿼리설정:::

CtlPaging.TotalItemCount = db.getScalar("SELECT COUNT(tesNo) FROM tTest where " + where);

string where = " a=1 and b=2 ";
string order = " order by tshNo desc";

string sql = CtlPaging.PagingQueryBuilder(CtlPaging.PageSize, CtlPaging.PageSize* PGN, "tTest", "tesNo", where, order);

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun

ASP.NET 웹 응용 프로그램의 페이지 및 응용 프로그램 컨텍스트

웹 응용 프로그램이 실행될 때 ASP.NET에는 현재 응용 프로그램, 각 사용자 세션, 현재 HTTP 요청, 요청된 페이지 등에 대한 정보가 유지된다. ASP.NET에는 이 컨텍스트 정보를 캡슐화하는 일련의 클래스가 포함되어 있다.

ASP.NET에서는 이들 클래스의 인스턴스를 사용자가 코드에서 액세스할 수 있는 내장 개체로 사용할 수 있도록 한다. 다음 표에서는 이러한 내장 개체를 나열하고 해당 개체가 어떤 클래스의 인스턴스인지를 보여 준다.

개체 이름

설명

ASP.NET 클래스

Response

현재 페이지의 출력 스트림에 대한 액세스를 제공. 이 클래스를 사용하여 페이지에 텍스트를 삽입하거나 쿠키를 쓰거나 기타 작업을 수행할 수 있다. 자세한 내용은 System.Web.UI.Page.Response 속성을 참조.

HttpResponse

Request

요청 헤더, 쿠키, 클라이언트 인증서, 쿼리 문자열 등의 현재 페이지 요청에 대한 액세스를 제공. 이 클래스를 사용하면 브라우저가 전송한 내용을 읽을 수 있다. 자세한 내용은 System.Web.UI.Page.Request 속성을 참조.

HttpRequest

Context

요청 개체를 비롯하여 전체 현재 컨텍스트에 대한 액세스를 제공. 이 클래스를 사용하면 페이지 간에 정보를 공유할 수 있다. 자세한 내용은 System.Web.UI.Page.Context 속성을 참조.

HttpContext

Server

페이지 간에서 컨트롤을 전송하거나, 최신 오류에 대한 정보를 가져오거나, HTML 텍스트를 인코딩 및 디코딩하는 등의 작업에 사용할 수 있는 유틸리티 메서드를 노출. 자세한 내용은 System.Web.UI.Page.Server 속성을 참조.

HttpServerUtility

Application

모든 세션에 응용 프로그램 수준의 메서드와 이벤트에 대한 액세스를 제공. 또한 정보를 저장하는 데 사용되는 응용 프로그램 수준 캐시에 대한 액세스를 제공.

HttpApplicationState

Session

현재 사용자 세션에 정보를 제공. 또한 정보를 저장하는 데 사용되는 세션 수준 캐시에 대한 액세스를 제공하며 세션 관리 방법을 제어하는 수단도 함께 제공.

HttpSessionState

Trace

HTTP 페이지 출력에 시스템 및 사용자 지정 추적 진단 메시지를 모두 표시하는 방법을 제공.

TraceContext

1. Application

1) 응용프로그램 상태에서 값 읽기

응용 프로그램 상태는 ASP.NET 응용 프로그램의 모든 클래스에서 사용할 수 있는 데이터 리포지토리이다. 응용 프로그램 상태는 서버의 메모리에 저장되고 데이터베이스에서 데이터를 저장하거나 가져오는 것보다 실행 속도가 빠르다. 단일 사용자 세션에만 해당되는 세션 상태와 달리 응용 프로그램 상태는 모든 사용자 및 세션에 적용된다. 따라서 사용자에 따라 변경되지 않고 자주 사용되는 소량의 데이터를 저장할 때 응용 프로그램 상태가 유용하다.

응용 프로그램 상태는 사용자가 응용 프로그램 내에서 URL 리소스에 처음으로 액세스할 때 만들어지는 새 HttpApplicationState 클래스 인스턴스에 저장된다. 응용 프로그램 상태에는 Object로 형식화된 데이터가 저장된다. 따라서 데이터를 응용 프로그램 상태에 저장할 때는 serialize할 필요가 없지만 데이터를 가져올 때는 적절한 형식으로 캐스팅해야 한다. null(Visual Basic에서는 Nothing) 개체를 캐스팅할 수 있지만 형식 검사와 같은 다른 방법을 통해 존재하지 않는 응용 프로그램 상태 항목을 사용하려고 하면 NullReferenceException 예외가 throw된다.

응용 프로그램 상태에서 값을 읽으려면 응용 프로그램 변수가 있는지 확인하고 액세스할 때 변수를 적절한 형식으로 변환한다.

다음 코드 예제에서는 응용 프로그램 상태의 AppStartTime값을 가져온 다음 이 값을 DateTime 형식의 appStateTime변수로 변환한다.

if (Application["AppStartTime"] != null)

{

  DateTime myAppStartTime = (DateTime)Application["AppStartTime"];

}

2) 응용프로그램 상태에서 값 저장

응용 프로그램 상태는 사용자가 응용 프로그램 내에서 URL 리소스에 처음으로 액세스할 때 만들어지는 새 HttpApplicationState 클래스 인스턴스에 저장된다. HttpApplicationState 클래스는 Application 속성을 통해 노출된다.

응용 프로그램 상태는 데이터를 Object 데이터 형식으로 저장한다. 따라서 데이터를 가져올 때는 적절한 형식으로 다시 변환해야 한다.

응용 프로그램 상태는 서버의 메모리에 저장되므로 대량의 데이터를 응용 프로그램 상태에 저장하면 서버 메모리가 금방 채워질 수 있다. 응용 프로그램을 다시 시작하면 응용 프로그램 상태 데이터가 손실된다. 응용 프로그램 상태는 웹 팜의 여러 서버 간에 또는 웹 가든의 작업자 프로세스 간에 공유되지 않는다. 마지막으로 응용 프로그램 상태는 자유 스레드이므로 응용 프로그램 상태에 저장되는 데이터에는 동기화 기능이 기본으로 제공되어야 한다.

응용 프로그램 상태에 값을 기록하려면 응용 프로그램에서 HttpApplicationState클래스의 변수 값을 설정한다.

다음 코드 예제에서는 응용 프로그램 변수 Message를 문자열로 설정하는 방법을 보여 준다.

Application["Message"] = "Welcome to the Contoso site.";

2. Request

1) 쿠키 읽기

쿠키를 사용하면 웹 응용 프로그램에서 기록이나 사용자 기본 설정 같은 사용자별 정보를 저장할 수 있다. 쿠키는 웹 서버와 클라이언트 간을 이동하는 요청/응답에 포함된 소규모의 텍스트 비트이다. 쿠키에는 사용자가 사이트를 방문할 때마다 웹 응용 프로그램에서 읽을 수 있는 정보가 포함되어 있다.

브라우저는 사용자 시스템의 쿠키를 관리해야 한다. 쿠키는 페이지 요청과 함께 서버에 전달되고 Cookies 컬렉션을 노출하는 HttpRequest개체의 일부로 액세스될 수 있다. 현재 도메인 또는 경로에 있는 페이지에서 만든 쿠키만 읽을 수 있다.

절차
쿠키를 읽으려면 쿠키의 이름을 키로 사용하여 Cookies컬렉션의 문자열을 읽는다.

다음 예제에서는 UserSettings쿠키를 읽은 다음 하위 키 Font의 값을 읽는다.

if (Request.Cookies["UserSettings"] != null)

{

  string userSettings;

  if (Request.Cookies["UserSettings"]["Font"] != null)

  { userSettings = Request.Cookies["UserSettings"]["Font"]; }

}

강력한 프로그래밍

보안상의 이유로 같은 도메인에 속해 있는 페이지에서 설정한 쿠키만 읽을 수 있다. 쿠키의 Path 속성이 설정된 경우에는 도메인에서 이 경로에 있는 하위 폴더 및 페이지에서만 쿠키를 사용할 수 있다.

특정 쿠키 값을 읽을 때는 해당 쿠키가 존재하는지 그리고 쿠키 값이 있는지 테스트해야 한다. 그렇지 않으면 예외가 발생한다.

쿠키의 모든 값은 String형식으로 저장되므로 쿠키 값을 다른 데이터 형식으로 사용하려면 값을 적절하게 변환해야 한다.

보안

브라우저에서는 처음에 쿠키를 만든 서버에만 데이터를 다시 보낼 수 있다. 악의적인 사용자가 쿠키에 액세스하여 쿠키 내용을 읽을 수 있다. 사용자 이름이나 암호 같은 중요한 정보는 쿠키에 저장하면 안된다. 대신 서버에서 중요한 정보를 찾는 데 사용할 수 있는 토큰을 저장한다. 또한 쿠키는 무단으로 변경될 수 있으므로 사이트 간 스크립팅 공격을 방지하기 위해 사용하는 방법을 그대로 사용하여 쿠키의 데이터를 처리해야 한다.

2) 쿠키 작성

Cookies 속성을 노출하는 HttpResponse 개체를 사용하여 쿠키가 클라이언트에 전달된다. 웹 응용 프로그램에서 브라우저에 보내려는 모든 쿠키는 이 컬렉션에 추가해야 한다. 새 쿠키를 작성하는 경우 Name Value를 지정해야 한다. 각 쿠키의 이름은 브라우저에서 후속 요청과 함께 쿠키를 보낼 때 웹 응용 프로그램에서 식별할 수 있도록 고유해야 한다.

두 가지 방법을 사용하여 사용자 컴퓨터에 쿠키를 작성할 수 있다. Cookies 컬렉션에 직접 쿠키 속성을 설정하거나, HttpCookie 개체의 인스턴스를 만들어 Cookies컬렉션에 추가할 수 있다. 클라이언트에 ASP.NET 페이지가 렌더링되기 전에 쿠키를 만들어야 한다. 예를 들어 Page_Load이벤트 처리기에는 쿠키를 작성할 수 있지만 Page_Unload이벤트 처리기에는 작성할 수 없다.

Cookies 컬렉션에 쿠키 속성을 설정하여 쿠키를 작성하려면 쿠키를 작성할 ASP.NET 페이지에서 Cookies컬렉션의 쿠키에 속성을 할당한다.
다음 코드 예제에서는
FontColor하위 키의 값이 설정된 UserSettings라는 쿠키를 보여 준다. 또한 만료 시간을 내일로 설정한다.

Response.Cookies["UserSettings"]["Font"] = "Arial";

Response.Cookies["UserSettings"]["Color"] = "Blue";

Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(1d);

HttpCookie 개체의 인스턴스를 만들어 쿠키를 작성하려면

1.     HttpCookie형식의 개체를 만들고 이름을 할당.

2.     쿠키의 하위 키에 값을 할당하고 쿠키 속성을 설정.

3.     Cookies컬렉션에 쿠키를 추가.

다음 코드 예제에서는 HttpCookie개체의 myCookie인스턴스를 보여 준다. 이 인스턴스는 UserSettings쿠키를 나타낸다.

HttpCookie myCookie = new HttpCookie("UserSettings");

myCookie["Font"] = "Arial";

myCookie["Color"] = "Blue";

myCookie.Expires = DateTime.Now.AddDays(1d);

Response.Cookies.Add(myCookie);

강력한 프로그래밍

기본적으로 쿠키는 같은 도메인에 있는 모든 페이지에서 공유하지만 Path 속성을 설정하여 웹 사이트의 특정 하위 폴더로 쿠키를 제한할 수 있다. 응용 프로그램의 모든 폴더에 있는 모든 페이지에서 쿠키를 검색할 수 있게 하려면 응용 프로그램의 루트 폴더에 있는 페이지에서 쿠키를 설정하고 Path속성을 설정하지 않으면 된다.

쿠키 만료 시간을 지정하지 않을 경우 쿠키는 클라이언트 컴퓨터에 지속되지 않고 사용자 세션이 만료되면 함께 만료된다.

쿠키는 String 형식의 값만 저장할 수 있다. 문자열이 아닌 값을 쿠키에 저장하려면 먼저 이 값을 문자열로 변환해야 한다. 대부분의 데이터 형식에 대해서는 ToString 메서드만 호출하면 된다.

쿠키의 삭제

사용자 컴퓨터에서 쿠키를 직접 삭제할 수 없다. 그러나 쿠키의 만료 날짜를 과거 날짜로 설정하여 사용자의 브라우저에서 쿠키를 삭제하도록 할 수 있다. 쿠키를 설정한 경로 또는 도메인에 있는 페이지를 사용자가 다음에 요청하면 브라우저에서 쿠키가 만료되었음을 확인한 후 제거한다.

Cookies 컬렉션의 Remove 메서드를 호출하면 서버측 컬렉션에서 쿠키가 제거되므로 클라이언트에 쿠키가 전달되지 않습니다. 그러나 클라이언트에 이미 쿠키가 있는 경우 이 메서드를 호출하면 클라이언트의 쿠키는 제거되지 않습니다.

쿠키에 과거 만료 날짜를 할당하려면

1.     쿠키가 있는지 확인하고 이미 있는 경우에는 이름이 같은 새 쿠키를 만든다.

2.     쿠키의 만료 날짜를 과거 시간으로 설정한다.

3.     Cookies컬렉션 개체에 쿠키를 추가한다.

다음 코드 예제에서는 쿠키에 과거 만료 날짜를 설정하는 방법을 보여 준다.

if (Request.Cookies["UserSettings"] != null)

{

  string userSettings;

  if (Request.Cookies["UserSettings"]["Font"] != null)

  { userSettings = Request.Cookies["UserSettings"]["Font"]; }

}

3. Server

1) 응용프로그램 수준 오류 처리

이 코드 예제에서는 요청을 처리하는 동안 처리되지 않은 모든 ASP.NET 오류 즉, Try/Catch 블록이나 페이지 수준 오류 처리기에서 catch되지 않은 모든 오류를 catch하는 오류 처리기를 Global.asax 파일에 만드는 방법을 보여 준. 예제에서 처리기는 컨트롤을 Errors.aspx라는 일반 오류 페이지로 전송하며, 일반 오류 페이지는 오류를 해석하여 적절한 메시지를 표시한다.

예제

// Handler in Global.asax file.
void Application_Error(Object sender, EventArgs e) {

  Server.Transfer("Errors.aspx");

  }

  // Handler in Errors.aspx file.

  protected void Page_Load(object sender, EventArgs e)

  {

  System.Text.StringBuilder errMessage = new StringBuilder();

  System.Exception appException = Server.GetLastError();

  if (appException is HttpException)

  {

     HttpException checkException = (HttpException)appException;

     switch (checkException.GetHttpCode())

     {

       case 403:

         {

           errMessage.Append("You are not allowed to view that page.");

           break;

         }

       case 404:

         {

           errMessage.Append("The page you requested cannot be found.");

           break;

         }

       case 408:

         {

           errMessage.Append("The request has timed out");

           break;

         }

       case 500:

         {

           errMessage.Append("The server cannot fullfill your request.");

           break;

         }

       default:

         {

           errMessage.Append("Ther server has experienced an error.");

           break;

         }

     }

  }

  else

  {

     // The exception was not an HttpException.

     errMessage.AppendFormat("The following error occurred<br />{0}",

       appException.ToString());

  }

  errMessage.Append("<br />Please contact the server administrator.");

  Label1.Text = errMessage.ToString();

  Server.ClearError();

  }

코드 컴파일

이 코드 예제에는 다음 사항이 필요하다.

·         웹 응용 프로그램

·         Label1이라는 Label 컨트롤이 포함된 Errors.aspx라는 Web Forms 페이지

강력한 프로그래밍

오류가 발생하기 쉬운 코드의 경우에는 전역 오류 처리기에 의존하는 것보다 Try/Catch블록 안에 해당 코드를 넣는 것이 좋다.

Global.asax 파일에 정의된 오류 처리기는 ASP.NET 런타임에서 요청을 처리하는 동안 발생하는 오류만 catch한다. 예를 들어, 사용자가 응용 프로그램에 없는 .aspx 파일을 요청하면 오류를 catch한다. 그러나 존재하지 않는 .htm 파일을 요청하면 오류를 catch하지 않는다. ASP.NET 오류가 아닌 경우에는 IIS(인터넷 정보 서비스)에 사용자 지정 처리기를 만들면 된다. 사용자 지정 처리기도 서버 수준 오류에 대해서는 호출되지 않는다.

Global.asax 파일에서 직접 요청의 오류 정보를 출력할 수는 없으며 컨트롤을 보통 Web Forms 페이지 등 다른 페이지로 전송해야 한다. 컨트롤을 다른 페이지로 전송할 때는 Transfer 메서드를 사용한다. 이렇게 하면 GetLastError 메서드에서 오류 정보를 가져올 수 있도록 현재 컨텍스트가 유지된다.

오류를 처리한 후에는 Server개체(HttpServerUtility 클래스) ClearError 메서드를 호출하여 오류 정보를 지워야 한다.

2) 페이지 수준 오류처리

이 코드 예제에서는 ASP.NET 웹 페이지의 Error 이벤트에 대한 처리기를 보여 준다. 이 처리기에서는 현재 페이지에서 처리되지 않은 모든 예외 즉, Try/Catch 블록을 사용하여 catch하지 못한 모든 오류를 catch한다.

예제

private void Page_Error(object sender, EventArgs e)

{

  Response.Write("An application error has been logged.");

  ApplicationSpecificErrorLogger(Server.GetLastError().Message);

  Server.ClearError();

}

코드 컴파일

이 예제에는 다음 사항이 필요하다.

·         ASP.NET 웹 페이지

·         응용 프로그램에 맞는 오류 로깅 기능

강력한 프로그래밍

오류가 발생하기 쉬운 코드의 경우에는 페이지 수준 오류 처리기에 의존하는 것보다 Try/Catch블록 안에 해당 코드를 넣는 것이 좋다.

Error처리기가 호출되면 페이지에서 컨트롤의 새 인스턴스가 만들어지지 않기 때문에 Label 컨트롤 등의 컨트롤에 오류 정보를 표시할 수 없다.

오류를 처리한 후에는 Server개체(HttpServerUtility 클래스) ClearError 메서드를 호출하여 오류 정보를 지워야 한다.

보안

<customErrors> 요소를 사용하여 자세한 오류 메시지를 로컬 사용자에게만 표시할 수 있다.

4. Session

1) 세션 상태에 값 저장

이 예제에서는 HttpSessionState 개체를 사용하여 개별 세션 안에 값을 유지한다.

예제

string firstName = "Jeff";

string lastName = "Smith";

string city = "Seattle";

Session["FirstName"] = firstName;

Session["LastName"] = lastName;

Session["City"] = city;

강력한 프로그래밍

기본적으로 20분 동안 사용하지 않을 경우 세션 상태가 만료될 수 있으며 저장된 정보가 손실될 수도 있다. sessionState 구성 섹션의 timeout특성을 사용하여 세션 상태 수명을 제어할 수 있다.

응용 프로그램의 요구 사항에 따라 세션 상태 외에 각 사용자에 대한 정보를 저장할 수 있는 대안을 고려해야 할 수도 있다. ASP.NET에는 응용 프로그램 내에서 데이터를 지속하기 위한 몇 가지 다른 옵션이 제공된다.

2) 세션 상태에서 값 읽기

이 예제에서는 Item 속성에 액세스하여 세션 상태에 있는 값을 검색한다.

예제

string firstName = (string)(Session["First"]);

string lastName = (string)(Session["Last"]);

string city = (string)(Session["City"]);

강력한 프로그래밍

존재하지 않는 세션 상태에서 값을 가져오는 경우에는 예외가 throw되지 않는다. 필요한 값이 세션 상태에 있는지 확인하려면 먼저 다음과 같이 개체의 존재를 검사한다.

if (Session["City"] == null)

  // No such value in session state; take appropriate action.

예를 들어, 형식 검사 등의 다른 방법으로 존재하지 않는 세션 상태 항목을 사용하려고 하면 NullReferenceException 예외가 throw된다.

세션 값은 Object 형식이다. C#에서는 세션 값을 읽을 때마다 항상 적절한 형식으로 캐스팅해야 한다.


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
이전버튼 1 이전버튼