[사파리, 파이어폭스]
// 쿠키 등록시 값을 UTF-8 형식으로 변환
// 변환하지 않으면 쿠키에 저장되는 문자들을 깨져버려서 쿠키가 없어지는 현상이 발생합니다.

Response.Cookies["name"].Value  = Server.UrlEncode("name");
Posted by 홍상길 홍상길
아래 소스는 Button1을 클릭했을때 GridView 에 데이터를 바인딩 시켜주는

소스중에서 GridView 만 제거 했습니다.

간단한 방법으로  asp:UpdateProgress 컨트롤 을 사용하는 방법입니다.

ProgressTemplate 테그안에 글을 써넣으셔도 되고

아래 소스는 로딩 이미지(gif)를 넣었습니다.
 
<asp:ScriptManager ID="ScriptManager1" runat="server">

            </asp:ScriptManager>

            <asp:UpdatePanel ID="UpdatePanel1" runat="server">

                <ContentTemplate>

                    <asp: Button ID="Button1" runat="server"

                       OnClick=" Button1_Click"/>

                </ContentTemplate>

            </asp:UpdatePanel>

            <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="100">

                <ProgressTemplate>

                    <div id="loadingcontrol" style=" position:absolute;top:200px;left:500px;">

                        <img alt="" src="Images/loading45.gif" /> // 로딩 이미지

                    </div>

                </ProgressTemplate>

            </asp:UpdateProgress>


Posted by 홍상길 홍상길

using System.Text.RegularExpressions;

if(Regex.IsMatch(TextBox1.Text, @"^[+-]?\d*(\.?\d*)$",RegexOptions.None))
{
// 정수형 또는 실수형이 아닐경우 MessageBox 창 띄우기
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('위도 입력형식이 잘못됬습니다.');", true);
                return;
}
Posted by 홍상길 홍상길
GridView 에 바인딩 시킨 데이터들을 Excel 파일로 내보내기.

Excel 파일은 97,2003 호환 버전으로 생성됩니다.

// 헤더설정
            Response.Clear();
            Response.AddHeader("content-disposition", @"attachment;filename=Test.xls"); // 파일이미지 설정
            Response.AddHeader("Expires", "0");
            Response.ContentType = "appliction/vnd.xls";
            StringWriter stringWrite = new StringWriter();
            HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

            // 한글 정상표시 되도록
            Response.Charset = "UTF-8";
            Response.ContentEncoding = Encoding.Default;

            // 엑셀에서 자동 숫자 변환 안되도록 하는 스타일
            string strStyle = @"<style>td { mso-number-format:\@; } </style>";

            GridView2.RenderControl(htmlWrite);

            // 엑셀에서 자동 숫자 변환 안되도록 스타일 적용
            Response.Write(strStyle);
            Response.Write(stringWrite.ToString());
            Response.End();
Posted by 홍상길 홍상길

<iframe src="./Agre.htm" frameborder="0" width="300" height="300" leftmargin="0" topmargin="0"
scrolling="auto"></iframe>
Posted by 홍상길 홍상길


 Web.Config

<connectionStrings>
 <add name="MyDB" connectionString="Data Source=[서버];Initial Catalog=[DB명];
UserID=[아이디];Password=[비밀번호]" providerName="System.Data.SqlClient"/>
</connectionStrings>

Code
SqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString);
Posted by 홍상길 홍상길

SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);

Posted by 홍상길 홍상길

출처 : http://cafe.daum.net/aspdotnet/OW7m/29 

페이지 안에 UpdatePanel 로 값을 넘겨주는 부분을 기술하고자 합니다. 이는 버튼으로는 충분하지

않습니다. 먼저 hidden TextBox 를 하나 추가하고 doPostBack 메소드를 호출하기 전에 그 값을 update 합니다.


hidden TextBox 추가하기


TextBox 는 값을 저장하는데 필요한 부분이며, 페이지에 보이지 않게 하기 위해서 CSS 로 숨겼습니다.

<asp:TextBox ID="text" runat="server" style="display:none;"></asp:TextBox>
<asp:Button ID="button" runat="server" 0nClick="button_Click" style="display:none;"/>


UpdatePanel 을 위한 비동기 trigger 등록하기

<asp:UpdatePanel runat="server" ID="UpdatePanel1" >
<ContentTemplate>
<asp:Label ID="label" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="button" EventName="Click" UpdateMode="Conditional" />
</Triggers>
</asp:UpdatePanel>





button 의 Click 이벤트에 AsyncPostBackTrigger 가 등록되어 있는것을 보실 수 있습니다.

발생된 이벤트로 의해 textbox 값으로 수정하게 될 부분을 label 에 추가합니다.
UpdateMode 를 꼭 Conditional 로 등록하는것을 잊지 마세요. 만약에 그 부분을 잊어 버리게 되면

UpdatePanel 이 trigger 가 발생될때나 postback 이 안쪽에 있을때 refresh 가 될것입니다.

UpdatePanel 가 refresh 할 자바스크립트 함수를 추가 합니다.

<a href="java_script:UpdPanelUpdate('Value passed 자바스크립트')">Update the Panel</a>

function UpdPanelUpdate(value)
{
var obj = document.getElementById("<%= text.ClientID %>");
obj.value=value;
__doPostBack("<%= button.ClientID %>","");
}
</script>

컨트롤의 ClientID 프로퍼티를 사용하면 컨트롤이 마스터페이지 안에 있다고 해도 정확한 ID 값을 얻을 수 있습니다. 이는 웹컨트롤이나 Repeater 또는 ID 가 변경될때 마다 .... 말이죠.

버튼이 postback 이 될때 hidden textbox 에 값을 설정합니다.


UpdatePanel 에 내용을 update 하기


그리고 마지막으로 클라이언트 단에서 자바스크립트 메소드로 인해 설정된 값을 기본으로 UpdatePanel 의 내용이 update 됩니다.

protected void button_Click(object sender, EventArgs e)
{
label.Text = text.Text;
}


이는 hidden textbox 에 설정된 값으로 UpdatePanel 안에 있는 label 이 text 로 인해 변경됩니다.

그리고 비동기 postback 을 통해서 전달합니다.


Posted by 홍상길 홍상길

.NET 환경에서 개인화 주소 구현

 

1.개요

 

닷넷 환경에서 개인화 주소를 어떻게 개발하고 어떤 이점들이 있는지 알아보겠습니다.

블로그나 기타 사이트들을 보면 개인화 주소를 사용하는 것을 볼 수 있습니다.

http://www.domain.com/blogid/postno형태의 구조를 가지는 개인화 주소도 있고,

http://www.blogid.com/postno형태의 구조를 가지는 개인화 주소도 있습니다.

이리저리 알아본 결과 이런 형태의 개인화 주소를 fancy url 이라고 합니다.

자바에서 주로 쓰이는 용어인 듯한데 용어의 의미가 닷넷이나 자바에 구애받지 않아 fancy url 이라는 용어로 사용할 것입니다.

이 문서는 fancy url의 의미를 알아보고 fancy url을 사용하는 이유와 어떻게 fancy url을 구현하는지에 대해서 알아보겠습니다.

 

2. Fancy Url

 

2.1. 의미

 

URL 주소를 표시할 때 특수 문자나 복잡한 문자열을 사용하지 않고 단순히 영문자와 숫자

그리고 / 문자로 구분하여 이를 짧게 표기하는 방식을 말합니다.

확장자나 GET 방식의 쿼리 스트링에 대한 표시를 단순화 하는 URL 표기법입니다.

 

2.2. 이점

 

l  URL의 단순 명료함

유저가 GET 방식의 복잡한 쿼리 스트링을 외워서 원하는 컨텐츠에 접근하기란 불가능에 가깝다고 볼 수 있습니다.

 

l  검색 엔진에서의 우선순위

대부분의 검색 엔진은 복잡한 쿼리스트링이 표시된 웹 페이지보다 fancy url 의 우선순위가 높다고 합니다.

, 같은 컨텐츠의 내용이라도 쿼리 스트링을 포함한 url보다 fancy url이 더 상위에 노출됩니다.

 

3. Fancy Url 구현

 

3.1. 원리

 

예를 들어 http://www.domain.com/blogid 라는 개인화된 주소가 있을 때 이 페이지의 실제 URL주소는 http://www.domain.com/blog/view.aspx?bid=blogid 입니다.

Front 단에서 fancy url 형태인지를 판별하여 fancy url이라면 blogid 값을 얻어

http://www.domain.com/blog/view.aspx?bid=blogid형태로 보여주게 됩니다.

주소창의 주소유지를 위해 frameset 이나 iframe 등으로 처리하여 웹 페이지에 보여주게 됩니다.

 

3.2. 구현

 

3.2.1. IIS 설정

 

fancy url은 확장자 없는 주소이기 때문에 IIS로 요청이 발생할 때 404 에러를 발생시킵니다.

그렇다고 모든 확장자에 대한 확장자 매핑을 해주게 된다면 isapi 필터를 통해 이미지 파일들이나 js, css, html 등등 서버에서 다 처리를 해줘야 하므로 서버에 부하가 많아지게 됩니다.

서버의 성능이나 여러 상황들을 가정했을 때 웹 서버에서 들어온 요청이 404 에러일 경우 Fancy Url인지 아닌지를 체크하는 방식이 제일 깔끔한 것 같아 이런 방식으로 개발했습니다.

IIS에서 404에러일 경우 특정 페이지(aspx)로 리디렉션 시켜주면 서버에서 처리를 하게 됩니다.

web.config에서 설정할 수도 있지만 보통 로컬에서 테스트할 때 CustomError 속성을 RemoteOnly로 하기 때문에

에러 페이지가 발생하여 디버깅 환경이 힘듭니다.

 

IIS 실행 ?적용할 사이트의 속성 클릭 ? 사용자 지정 오류 탭 ? 404 수정 ? NullPage.aspx ? 적용

실제로 NullPage.aspx 페이지는 서버에 존재하지 않는 페이지입니다.

필자가 개발중엔 사이트의 Fancy Url Global.asax에서 처리하기 때문에 NullPage.aspx 페이지로 리디렉션해도

어차피 isapi 필터를 통해 웹서버에 요청하게 되고 Global.asax를 수행하게 됩니다.

Global에서 처리하지 않고 실제로 NullPage.aspx 페이지를 생성하여 처리해도 무방합니다.

사이트의 성격이 fancy url의 접근도가 낮다면 NullPage.aspx에서 구현하는 것이 바람직하지만,

개발중인 사이트는 접근도가 많기 때문에 Global에서 체크하여 처리하도록 하였습니다.

자신의 사이트의 성격에 맞게 개발하시면 될 듯 합니다.

 

3.2.2. Global.asax

 

실질적으로 Fancy Url 을 담당하는 놈이 Global.asax Application_BeginRequest 이벤트입니다.

개발중인 사이트의 Fancy Url 구조는 http://www.domain.com/blogid/postno 이기 때문에

“/” 문자 배열로 받아 저장하여 요청 들어온 Url을 분석합니다.

만일 “/” 문자열이 없다면 이는 Fancy Url 이 아닌 일반 쿼리스트링을 포함한 Url이 될 것이고

하나라면 www.domain.com/blogid 형태의 Fancy Url이 될 것입니다.

두개라면 www.domain.com/blogid/postno 형태겠죠..

 

설명만으로는 힘든 부분이 많아 소스를 발췌하여 설명드리겠습니다.

 

 

ArrayList pathList = new ArrayList();

string path = Request.RawUrl;

string[] arrayPath = path.Split('/');

for (int i = arrayPath.Length - 1; i >= 0; i--)

{

             if (arrayPath[i] != string.Empty && arrayPath[i] != "ePlayon.Batoo.WEB")

             {

                           if (arrayPath[i].IndexOf(".") == -1 && arrayPath[i] != "jsdebug")

                           {

                                        pathList.Add(arrayPath[i]);

                           }

                           else

                           {

                                        break;

                           }

             }

}

 

위 소스는 현재 요청 URL 을 분석하여 pathList 라는 배열리스트에 FancyUrl 구조를 담습니다.

앞서 말했듯이 pathList의 카운트가 0이라면 일반 URL이고 1이면 블로그, 2라면 포스트 요청을 수행하게 됩니다.

 

 

if (pathList.Count == 1)

{//FancyUrl

             LockerRoomManager manager = new LockerRoomManager();

             string lno = manager.GetLockerRoomGuidByUrl(pathList[0].ToString());

 

             if (lno != string.Empty)

             {

                           StringBuilder retHtml = new StringBuilder();

                           retHtml.Append("<html xmlns='http://www.w3.org/1999/xhtml' >\n");

                           retHtml.Append("\t<head>\n");

                           retHtml.Append("\t\t<title>" + pathList[0].ToString() + " ?쎌빱?/title>\n");

                           retHtml.Append("\t\t<frameset rows='0,*' border=0>\n");

                           retHtml.Append("\t\t\t<frame src='#' name=main>\n");

                           retHtml.Append("\t\t\t<frame src='../LockerRoom/PostList.aspx?lno=" + lno + "'>\n");

                           retHtml.Append("\t\t</frameset>\n");

                           retHtml.Append("\t</head>\n");

                           retHtml.Append("\t<noframes>\n");

                           retHtml.Append("\t\t<body>\n");

                           retHtml.Append("\t\t\t<div></div>\n");

                           retHtml.Append("\t\t</body>\n");

                           retHtml.Append("\t</noframes>\n");

                           retHtml.Append("</html>\n");

                           Response.Write(retHtml.ToString());

                           Response.End();

             }

             else

             {

                           if (path.IndexOf(".asmx") == -1)

                           {

                                        Response.Redirect("~/Error/404.html");

                           }

             }

}

 

위 소스는 블로그 Fancy Url일 경우 처리하는 로직입니다.

블로그 아이디를 얻어와서 DB에 해당 블로그의 아이디가 있는지 검사합니다.

있다면 StringBuilder 객체로 html 코드를 생성하여 뿌려줍니다.

Frameset을 이용했는데 이를 이용함으로써 주소창의 주소가 계속 유지할 수 있습니다.

만일 블로그 아이디가 없다면 404에러 페이지로 리디렉션 시킵니다.

 

포스트 Fancy Url도 블로그 Fancy Url과 형태가 같습니다.

이렇게 함으로써 정상적으로 Fancy Url의 처리를 완료 할 수 있습니다.

 

4. 마무리

Fancy Url을 개발하면서 많은 삽질을 해야 했습니다.

처음에 쉽게 구현이 될 줄 알았는데 처음 생각과 달리 HttpHandler HttpModule을 사용하여 개발하려고도 해봤고 실제 이렇게 개발하고 나니 프로젝트 관리에 문제가 있어 처음대로 Global로 선회하였습니다.

 

 

--------------------------------------------

written by 허둥사마

http://tit99hds.egloos.com/

-------------------------------------------- 

Posted by 홍상길 홍상길

■ 간단한 Session 생성해보자.

     1. aspx 파일을 생성

 

     2. Label 생성

 

     3. 디자인화면에서 더블클릭해서 코딩을 하자.

        private void Page_Load(object sender, System.EventArgs e)
        {
             Label1.Text = Session.SessionID;
             Session.Timeout = 5; // 5분 뒤 소멸하겠다는 뜻.
             Session["num"] = 100;  // 값을 입력하고..
             Label1.Text += Session["num"].ToString();
// 값을 꺼내오자  

        }

 

     4. 브라우저를 띄워보자.

        

 

 

 

 

 

■ Session 을 내 컴이 아닌 다른 컴에 저장시켜보자.

     클라이언트 100명이 서버에 달라붙어서 작업을 하고 있었어.

     순간적으로 전기가 나갔고 1분만에 복구를 한다면..

     기본 사람들이 전부 '로그아웃'이 되어버려..

 

     근데 Session을 다른 컴에 옮겨놓으면 전기가 나가도 Session 이 유지되지.

     다만 전원이 나간 경우에 새로들어온 사용자들은 불편을 느끼겠지.

 

     ▶ 이게 세션을 분리시키는 첫번째 방법이야.

 

 

     ▶ 이번에는 세션을 DB에 저장을 시키는 두 번째 방법이야. 꾸준한 기록관리가 가능하지..(이런 방법이 많지는 않어.)

         DB 에 세션을 보관한다고 치면 웹서버가 여러개더라도 상관이 없어. 공유를 시켜놓으면 가능하다는 거지.

 

    

    ※ Web.config를 간단히 살펴보면

        sessionState

             mode = "Off | InProc | StateServer | SQLServer";  // 세션이 필요없다면 끄라는거야. 세션은 서버메모리에 상주하거든.

                                     ↑ InProc는 서버메모리에 '세션'을 올려다 쓰기에 가장 빠르고 보안측면에서 가장 좋아.

                                         안정성면에 있어서는 떨어져. 웹서버가 죽으면 세션도 같이 죽어버리거든..

              

                                     ↑ StateServer 로 할려면 관리도구에서  를 선택하고

                                        를 선택한 다음..

                                        

                                         '시작'을 클릭...

                                         웹서비스에만 문제가 있어도 세션이 유지가 되는 이점이 있어.

                                         의도적으로 웹서비스를 중지하려면  에서

                                          을 중지했다가 다시 시작버튼을 누리면 되고...

 

                                         즉, 웹서비스가 중지되었다고 시작되면 세션의 정보가 원래는 날라가게 되어있지.

                                              글을 쓰다가 웹서비스중단되면 쓰던 글이 다 날라간다는 뜻이야..

                                         근데,  녀석으로 셋팅을 한다면

                                              웹서비스가 죽더라도 클라이언트는 모르고 '세션'도 죽지않고 살아있다는 거야..

                                              '세션'을 관리하는 프로세서는 살아있기 때문에 가능한거야..

 

 

                                     ↑ SQLServer 를 사용할려면 쿼리분석기를 일단 실행시켜.

                                        C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 에 위치한  를 복사해서

                                        쿼리분석기에서 실행시켜보면 먼가 생성이 된것을 확인 할 수 있어.

                                        요점은.... '세션'을 DB에 저장시켜놓고 관리하다는 거지.

 

 

 

▶▶ 솔루션탐색기에서  을 열어보자.

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   
  <system.web>

    <!--  동적 디버깅 컴파일
          ASPX 디버깅을 사용하려면 compilation debug="true"로 설정합니다. 이렇게 하지 않고
          해당 값을 false로 설정하면 이 응용 프로그램의 런타임 성능이 향상됩니다.
          컴파일된 페이지에 디버깅 기호(.pdb 정보)를 삽입하려면 compilation debug="true"로 설정합니다.
          이렇게 하면 파일 크기가 커져서 실행 속도가 느려지므로
          디버깅하는 경우에만 이 값을 true로 설정하고
          디버깅하는 경우 외에는 모두 false로 설정합니다. 자세한 내용은 ASP.NET 파일 디버깅에 관한
          설명서를 참조하십시오.
    -->

    <compilation
         defaultLanguage="c#"
         debug="true"
    />

    <!--  사용자 지정 오류 메시지
          사용자 지정 오류 메시지를 사용하려면 customErrors mode="On" 또는 "RemoteOnly"로 설정하고 사용하지 않으려면 "Off"로 설정합니다.
          처리할 각 오류에 <error> 태그를 추가하십시오.

          "On" 항상 사용자에게 친숙한 메시지가 표시됩니다.
          "Off" 항상 자세한 ASP.NET 오류 정보가 표시됩니다.
          "RemoteOnly" 로컬 웹 서버에서 액세스하지 않는 사용자에게만 사용자에게 친숙한
           메시지가 표시됩니다. 이 설정은 원격 클라이언트에서 응용 프로그램의 자세한 정보가
           표시되지 않도록 보안을 강화할 때 사용하면 좋습니다.
    -->
    <customErrors
    mode="RemoteOnly"
    />

    <!--  인증
          이 섹션에서는 응용 프로그램의 인증 정책을 설정합니다. 가능한 모드로는 "Windows",
          "Forms", "Passport" 및 "None"이 있습니다.

          "None"을 지정하면 인증이 수행되지 않습니다.
          "Windows"를 지정하면 IIS가 인증 설정에 따라 인증을 수행합니다(기본, 다이제스트 또는 Windows 통합 인증).
           익명 액세스는 IIS에서 비활성화시켜야 합니다.
          "Forms"를 지정하면 사용자에게 자격 증명을 입력할 수 있는 사용자 지정 양식(웹 페이지)를
           표시하여 사용자를 응용 프로그램에서 인증합니다. 사용자 자격 증명 토큰은 쿠키에 저장됩니다.
          "Passport"를 지정하면 인증이 Microsoft에서 제공하는 중앙 집중식 인증 서비스를 통해 수행되며,
           이 서비스는 멤버 사이트에 대해 단일 로그온과 핵심 프로필 서비스를 제공합니다.
    -->


    <authentication mode="Windows" />

 <!--  권한 부여
           이 섹션에서는 응용 프로그램의 권한 부여 정책을 설정합니다. 사용자 또는 역할에 따라 응용 프로그램 리소스에 대한
          액세스를 허용하거나 거부할 수 있습니다. 와일드카드 "*"는 모든 사용자를 의미하고 "?"는 인증되지 않은
          익명의 사용자를 의미합니다.
    -->

    <authorization>
        <allow users="*" /> <!-- 모든 사용자를 허용합니다. -->
            <!--  <allow     users="[쉼표로 구분된 사용자 목록]"
                             roles="[쉼표로 구분된 역할 목록]"/>
                  <deny      users="[쉼표로 구분된 사용자 목록]"
                             roles="[쉼표로 구분된 역할 목록]"/>
            -->
    </authorization>

 

    <!--  응용 프로그램 수준 추적 로깅
          응용 프로그램 수준 추적을 사용하면 응용 프로그램 내의 모든 페이지에 대한 추적 로그 출력이 가능합니다.
          응용 프로그램 추적 로깅을 사용하려면 trace enabled="true"로 설정합니다. pageOutput="true"이면
          각 페이지의 아래쪽에 추적 정보가 표시됩니다. 그렇지 않으면
          웹 응용 프로그램 루트에서 "trace.axd" 페이지를 찾아서 응용 프로그램 추적 로그를
          볼 수 있습니다.
    -->

    <trace
        enabled="false"
        requestLimit="10"
        pageOutput="false"
        traceMode="SortByTime"
  localOnly="true"
    />

 

 

    <!--  세션 상태 설정
          기본적으로 ASP.NET에서는 쿠키를 사용하여 특정 세션에 속한 요청을 식별합니다.
          쿠키를 사용할 수 없는 경우 세션 식별자를 URL에 추가하여 세션을 추적할 수 있습니다.
          쿠키를 사용하지 않으려면 sessionState cookieless="true"로 설정합니다.

                     쿠키를 안쓴다면 브라우져 주소창을 보면 get방식으로 데이터를 주고받어..

                     근데, 거의 이렇게 쓸 일이 없다고 보면 되고..
    -->

    <sessionState
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
            cookieless="false"
            timeout="20"
    />

 

    <!--  전역화
          이 섹션에서는 응용 프로그램의 전역화 설정을 설정합니다.
    -->

    <globalization
            requestEncoding="utf-8"
            responseEncoding="utf-8"
   />
  
 </system.web>

</configuration>

Posted by 홍상길 홍상길
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
홍상길

공지사항

Yesterday9
Today1
Total293,506

달력

 « |  » 2019.9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

최근에 달린 댓글

글 보관함