Postback problem when using URL Rewrite and 404.aspx

Posted by salle55 on Stack Overflow See other posts from Stack Overflow or by salle55
Published on 2009-01-04T15:47:19Z Indexed on 2010/04/19 10:53 UTC
Read the original article Hit count: 637

Filed under:
|
|
|

I'm using URL rewrite on my site to get URLs like:
http://mysite.com/users/john
instead of
http://mysite.com/index.aspx?user=john

To achive this extensionless rewrite with IIS6 and no access to the hosting-server I use the "404-approach". When a request that the server can't find, the mapped 404-page is executed, since this is a aspx-page the rewrite can be performed (I can setup the 404-mapping using the controlpanel on the hosting-service).

This is the code in Global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
	string url = HttpContext.Current.Request.Url.AbsolutePath;
	if (url.Contains("404.aspx"))
	{
		string[] urlInfo404 = Request.Url.Query.ToString().Split(';');
		if (urlInfo404.Length > 1)
		{
			string requestURL = urlInfo404[1];
			if (requestURL.Contains("/users/"))
			{
				HttpContext.Current.RewritePath("~/index.aspx?user=" + GetPageID(requestURL));				
				StoreRequestURL(requestURL);
			}
			else if (requestURL.Contains("/picture/"))
			{
				HttpContext.Current.RewritePath("~/showPicture.aspx?pictureID=" + GetPageID(requestURL));
				StoreRequestURL(requestURL);
			}
		}
	}
}

private void StoreRequestURL(string url)
{
	url = url.Replace("http://", "");
	url = url.Substring(url.IndexOf("/"));
	HttpContext.Current.Items["VirtualUrl"] = url;
}

private string GetPageID(string requestURL)
{
	int idx = requestURL.LastIndexOf("/");
	string id = requestURL.Substring(idx + 1);
	id = id.Replace(".aspx", ""); //Only needed when testing without the 404-approach
	return id;
}

And in Page_Load on my masterpage I set the correct URL in the action-attribute on the form-tag.

protected void Page_Load(object sender, EventArgs e)
{
    string virtualURL = (string)HttpContext.Current.Items["VirtualUrl"];
    if (!String.IsNullOrEmpty(virtualURL))
    {
    	form1.Action = virtualURL;
    }
}

The rewrite works fine but when I perform a postback on the page the postback isn't executed, can this be solved somehow?

The problem seems to be with the 404-approach because when I try without it (and loses the extensionless-feature) the postback works. That is when I request:
http://mysite.com/users/john.aspx

Can this be solved or is there any other solution that fulfil my requirements (IIS6, no serveraccess/ISAPI-filter and extensionless).

© Stack Overflow or respective owner

Related posts about ASP.NET

Related posts about url-rewriting