urlMappings в asp.net2.0 очень прост в использовании, но, к сожалению, он не поддерживает регулярные выражения. Однако, к счастью, если вы используете IHttpModule,
независимо от типа запроса, он сначала пройдет через IHttpModule, что дает хороший результат. возможность перезаписи URL-адресов:
Ниже приведен написанный мною IHttpModule:
using System;
использование
общедоступного класса ReWriteModule:IHttpModule;
{
общедоступный ReWriteModule()
{
}
общедоступная строка переопределения ToString()
{
верните это.GetType().ToString();
}
void IHttpModule.Dispose()
{
}
частный статический System.Xml.XmlDocument ruleDoc = null;
частный статический System.Xml.XmlDocument GetRuleConfig (приложение System.Web.HttpContext)
{
если (ruleDoc == ноль)
{
RuleDoc = новый System.Xml.XmlDocument();
ruleDoc.Load(app.Server.MapPath("~/rule.xml"));
}
вернуть правилоДок;
}
общедоступная статическая строка GetUrl (System.Web.HttpContext cxt, путь к строке)
{
System.Xml.XmlDocument doc = GetRuleConfig(cxt);
System.Xml.XmlNodeList lst = doc.GetElementsByTagName("RewriterRule");
строка похлопывать="";
foreach (System.Xml.XmlNode и в списке)
{
System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
foreach(System.Xml.XmlNode chk в суб)
{
pat = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = новый System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
если (reg.IsMatch (путь))
{
return reg.Replace(path, nd.ChildNodes[1].InnerText);
}
}
}
вернуть ноль
}
;
void IHttpModule.Init (контекст HttpApplication)
{
context.BeginRequest += делегат (отправитель объекта, EventArgs e)
{
System.Web.HttpContext cxt = context.Context;
if (cxt.Request.ContentType != "изображение/pjpeg")
{
тип строки = cxt.Request.ContentType.ToLower();
строковый путь = cxt.Request.Path;
строка apppath = cxt.Request.ApplicationPath;
путь = путь.Удалить(0, apppath.Length);
путь = «~» + путь;
строка newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
если (newUrl != ноль)
{
cxt.Response.Filter = новый ResponseFilter(cxt.Response.Filter,cxt.Request.Path);
cxt.Response.Write("Запрошенный путь:" + путь);
cxt.Response.Write("<BR>");
cxt.Response.Write("Перенаправленный целевой URL: " + newUrl);
cxt.Response.Write("<BR>");
cxt.RewritePath(newUrl);
} // Используется, если требуется обработка всех запросов
//еще
//{
// cxt.Response.Write(cxt.Request.Path + "<BR>");
// cxt.Response.Write("Запрошенный вами ресурс не существует или у вас нет разрешения на доступ!");
// cxt.Response.Flush();
// cxt.Response.End();
//}
}
};
}
}
Поскольку после перезаписи URL-адреса Действие в исходной ВЕБФОРМЕ изменится, что легко может привести к тому, что запрошенный ресурс не существует
. Что конкретно? Будет ясно, если вы DX взглянете на это! ! !
Все, что у нас есть, это ResponseFilter, который реализован следующим образом:
общедоступный класс ResponseFilter:System.IO.Stream.
{
public ResponseFilter (приемник System.IO.Stream, строка _str)
{
_раковина = раковина;
//
// TODO: добавить сюда логику конструктора
//
this.str = _str;
}
частная строка str = "";
частный System.IO.Stream _sink;
частная длинная позиция;
частный System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030");
частный System.Text.StringBuilder oOutput = новый System.Text.StringBuilder();
// Следующие члены Stream должны быть переопределены.
публичное переопределение bool CanRead
{
получить {вернуть истину}
}
общедоступное переопределение bool CanSeek
{
получить {вернуть истину}
}
публичное переопределение bool CanWrite
{
получить {вернуть истину}
}
публичное переопределение большой длины
{
получить {вернуть 0;
}
публичное переопределение длинной позиции
{
получить {вернуть _position;
установить {_position = значение};
}
public переопределить long Seek (длинное смещение, направление System.IO.SeekOrigin)
{
return _sink.Seek(смещение, направление);
}
Публичное переопределение void SetLength (длинная длина)
{
_sink.SetLength(длина);
}
публичное переопределение void Close()
{
_sink.Закрыть();
}
публичное переопределение void Flush()
{
_sink.Flush();
}
Публичное переопределение int Read (буфер байта [], смещение целого числа, количество целых чисел)
{
return _sink.Read(буфер, смещение, счетчик);
}
// Метод Write фактически выполняет фильтрацию.
общедоступное переопределение void Write (буфер байта [], смещение целого числа, количество целых чисел)
{
строка szBuffer = System.Text.UTF8Encoding.UTF8.GetString(буфер, смещение, счетчик);
строка ap="action="";
интервал поз=-1;
if ((pos=szBuffer.IndexOf(ap) )!= -1)
{
int epos = szBuffer.IndexOf(""", pos + ap.Length+1);
если (эпос != -1)
{
szBuffer= szBuffer.Remove(pos + ap.Length, epos - pos - ap.Length);
}
szBuffer = szBuffer.Insert(pos + ap.Length, this.str[
] data = System.Text.UTF8Encoding.UTF8.GetBytes(szBuffer);
_sink.Write(данные, 0, данные.Длина);
}
еще
{
oOutput.Append(szBuffer);
}
//Следующий абзац можно использовать для изменения содержимого между <Head></head>;
//Regex oEndFile = new Regex("</head>", RegexOptions.IgnoreCase|RegexOptions.Compiled);
//если (oEndFile.IsMatch(szBuffer))
//{
// //Добавляем последний буфер данных
// //Добавляем последнюю часть данных в буфер
// oOutput.Append(szBuffer);
// //Получаем полный ответ для клиента
// //Передача полных данных возврата клиента
// строка szCompleteBuffer = oOutput.ToString().ToLower();
// int ipos = szCompleteBuffer.IndexOf("<title>");
// int epos = szCompleteBuffer.IndexOf("</title>",ipos+7);
// строка sp = szCompleteBuffer.Substring(ipos+7, epos - ipos );
// szCompleteBuffer = szCompleteBuffer.Remove(ipos+7,sp.Length-7);
// szCompleteBuffer = szCompleteBuffer.Insert(ipos + 7, "dhz");
// // szCompleteBuffer = szCompleteBuffer.Replace(sp, "dhz");
// //Нет совпадений, поэтому запишите исходные данные
// //Нет совпадений, поэтому написан исходный код
// данные byte[] = System.Text.UTF8Encoding.UTF8.GetBytes(szCompleteBuffer);
// _sink.Write(data, 0, data.Length);
//}
//еще
//{
// oOutput.Append(szBuffer);
//}
}
}
//////Правила ожидания настраиваются следующим образом с использованием XML-файлов,
но вы также можете сделать это через специальный раздел конфигурации в web.config
<?xml version="1.0"coding="utf-8" ? >
<Правила>
<Правило Рерайтера>
<ЛукФорс>
<LookFor>~/(d{4})/(d{2}).html</LookFor>
<LookFor>~/(d{4})/(d{2})/</LookFor>
<LookFor>~/(d{4})/(d{2})</LookFor>
<LookFor>~/(d{4})/(d{2})/index.html</LookFor>
</ЛукФорс>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</RewriterRule>
<Правило Рерайтера>
<ЛукФорс>
<LookFor>~/pc</LookFor>
</ЛукФорс>
<SendTo>~/Test2.aspx</SendTo>
</RewriterRule>
</Правила>
//Это правило написано не очень хорошо. Например, первое можно сделать с помощью регулярного выражения. Но на данный момент я не знаю, как это правильно написать. Кажется, мне нужно использовать какую-то концепцию группы антизахвата, я подумываю об этом! !