Używam przepisywania adresów URL w mojej witrynie, aby uzyskać adresy URL takie jak:
http://mysite.com/users/john
zamiast
http://mysite.com/index.aspx?user=john
Aby osiągnąć to przepisywanie bez rozszerzeń z IIS6 i bez dostępu do serwera hostingowego, używam "podejścia 404". Gdy żądanie, którego serwer nie może znaleźć, zmapowana strona 404 jest wykonywana, ponieważ jest to strona aspx, którą można przepisać (mogę ustawić mapowanie 404 za pomocą panelu sterowania w usłudze hostingowej).
To jest kod w 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;
}
A w Page_Load na mojej stronie głównej ustawiłem poprawny adres URL w atrybucie akcji w tagu formularza.
protected void Page_Load(object sender, EventArgs e)
{
string virtualURL = (string)HttpContext.Current.Items["VirtualUrl"];
if (!String.IsNullOrEmpty(virtualURL))
{
form1.Action = virtualURL;
}
}
Przepisanie działa dobrze, ale kiedy wykonuję postback na stronie, postback nie jest wykonywany, czy można to jakoś rozwiązać?
Wydaje się, że problem dotyczy podejścia 404, ponieważ gdy próbuję bez niego (i tracę funkcję bez rozszerzenia), postback działa. Wtedy żądam:
http://mysite.com/users/john.aspx
Czy można to rozwiązać, czy jest jakieś inne rozwiązanie, które spełnia moje wymagania (IIS6, bez dostępu do serwera/filtra ISAPI i bez rozszerzeń).