RewritePath 와 포스트백(Postback)의 문제
 
RewirtePath 를 사용하여, 웹의 요청을 가로채서 경로를 재작성하여 사용할 수 있습니다. 언뜻 보기에, 굉장히 놀라운 기능인 것은 분명하지만, 이것은 ASP.NET 에서 사용하기에 결정적인 문제가 있습니다. 그 원인은 다음과 같습니다.
 
다음과 같이 HttpModule 에서 웹 요청을 가로채어 RewritePath 로 경로 재작성한 샘플입니다. (확장자만 제거해 보았습니다)
 
 
HTML 코드는
 
 
과 같이 <form runat=”server”> 로 되어 있습니다. 여기에서 이 form 이 서버 태그로써 HTML 로 랜더링 될 때 강제적으로 다음과 같이 form 태그가 랜더됩니다.
 
 
그렇기 때문에, Button이나 LinkButton 등의 서버컨트롤을 사용하게 되면 포스트백이 발생되고, form 태그의 action 속성의 URL 로 포스트백이 발생합니다. 아래와 같이 Button 컨트롤에 마우스를 가져다 대면 RewritePath 로 재작성된 경우(물리적인 실제 웹페이지) 를 가리키게 됩니다.
 
 
위의 Button 컨트롤, 또는 LinkButton 등 포스트백이 발생하는 모든 컨트롤에 대해서 포스트백 후 원래의 웹페이지 주소로 아래와 같이 변하게 됩니다.
 
 
이것이 ASP.NET 플랫폼에서 의도된 것인지, 어떤 사람들은 버그라고 말을 합니다. 어느 것이 진실인지 저는 잘 모르겠지만, 분명 개발자를 고민에 빠트릴 만하다는 것입니다.
 
 
RewritePath 의 포스트백 후의 URL 변경 문제 해결하기
 
문제를 해결하기 위해 대표적인 두가지 방법이 있습니다.
 
1.      HtmlPage 를 상속한 컨트롤 만들기
모든 페이지의 <Form runat=”server”> 태그를 상속된 HtmlPage 컨트롤로 변경해 주어야 합니다. 때문에 매우 번거롭죠. 폼을 만들 때 마다, 이것부터 수정해 주셔야 할테니까요.

2.      Page 의 Render 메서드를 override 하기
1번 보다는 코드가 복잡하지만, 가장 현실적인 대안입니다. 기존 코드의 수정을 하지 않고, 전역적으로 웹 어플케이션에서 적용할 수 있습니다.
 
위의 링크를 따라가면 비록 영문이긴 하지만, 좋은 대안이 될 수 있을 것입니다.
 
2번의 원문 소스가 제대로 작동하지 않는 부분이 있어서, 수정해 보았습니다.
 
우선 HttpModule 을 구현하는 것 까지 모두 동일 하게 구현하시면 되고, HtmlTextWrtier 클래스만 보여드리도록 하겠습니다.
 
internal class FormActionFixTextWriter : HtmlTextWriter
{
       private string action;
       private bool inForm;
 
       public FormActionFixTextWriter(HtmlTextWriter writer, string action)
             : base(writer)
       {
             this.action = action;
       }
 
       public override void WriteBeginTag(string tagName)
       {
             inForm = String.Compare(tagName,"form",true) == 0;
 
             base.WriteBeginTag(tagName);
       }
 
       public override void WriteAttribute(string name, string value, bool fEncode)
       {
             if (inForm && String.Compare(name, "action") == 0)
             {
                    value = this.action;
             }
 
             base.WriteAttribute(name, value, fEncode);
       }
}
 
실행 결과를 보면.
 
 
위와 같이 요청된 URL 그대로 포스트백이 발생할 수 있도록 form 태그의 action 속성의 URL 이 수정된 것을 알 수 있습니다.
 
이번 주말에는 강원도에서 나보다 나이 어린 사촌 결혼식 갔다가 부러워 죽는 줄 알았습니다. 그리고 갑자기 친구 어머니의 교통 사고 소식에 문병 다니고, 금방 쓰러져 자야겠습니다. 피곤한 주말이었습니다. ^^;

참고
http://msdn2.microsoft.com/en-us/library/ms972974.aspx
http://weblogs.asp.net/jezell/archive/2004/03/15/90045.aspx

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 땡초 POWERUMC

댓글을 달아 주세요