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 컨트롤로 변경해 주어야 합니다. 때문에 매우 번거롭죠. 폼을 만들 때 마다, 이것부터 수정해 주셔야 할테니까요.
모든 페이지의 <Form runat=”server”> 태그를 상속된 HtmlPage 컨트롤로 변경해 주어야 합니다. 때문에 매우 번거롭죠. 폼을 만들 때 마다, 이것부터 수정해 주셔야 할테니까요.
2. Page 의 Render 메서드를 override 하기
1번 보다는 코드가 복잡하지만, 가장 현실적인 대안입니다. 기존 코드의 수정을 하지 않고, 전역적으로 웹 어플케이션에서 적용할 수 있습니다.
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
참고
http://msdn2.microsoft.com/en-us/library/ms972974.aspx
http://weblogs.asp.net/jezell/archive/2004/03/15/90045.aspx
'.NET > ASP.NET' 카테고리의 다른 글
실전 ASP.NET Session [1] - 쿠키를 이용한 상태관리와 위험성 (0) | 2008.05.25 |
---|---|
Custom Config 에 Intellisence 날개를 달자 (0) | 2008.04.27 |
RewritePath 와 포스트백(Postback) 문제와 해결 방법 (0) | 2008.04.13 |
ASPX 확장명 변경과 Visual Studio 에 적용하기 (0) | 2008.04.06 |
웹사이트를 웹 응용 프로그램으로 변환하기 (2) | 2007.11.10 |
FTP 자격인증을 저장하는 방법 (0) | 2007.07.29 |