من السهل جدًا استخدام urlMappings في asp.net2.0، لكنه للأسف لا يدعم التعبيرات العادية، ومع ذلك، لحسن الحظ، إذا كنت تستخدم IHttpModule،
بغض النظر عن نوع الطلب، فسوف يمر عبر IHttpModule أولاً، مما يوفر خدمة جيدة. فرصة لإعادة كتابة عنوان URL:
ما يلي هو IHttpModule الذي كتبته:
use System;
باستخدام System.Web
الفئة العامة ReWriteModule:IHttpModule
{
ReWriteModule العامة ()
{
}
سلسلة التجاوز العامة ToString ()
{
إرجاع this.GetType().ToString();
}
باطلة IHttpModule.Dispose()
{
}
System.Xml.XmlDocument الخاص الثابت RuleDoc = null;
System.Xml.XmlDocument GetRuleConfig ثابت خاص (تطبيق System.Web.HttpContext)
{
إذا (ruleDoc == فارغة)
{
RuleDoc = new System.Xml.XmlDocument();
RuleDoc.Load(app.Server.MapPath("~/rule.xml"));
}
إرجاع القاعدةDoc;
}
سلسلة ثابتة عامة GetUrl(System.Web.HttpContext cxt، مسار السلسلة)
{
System.Xml.XmlDocument doc = GetRuleConfig(cxt);
System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule");
سلسلة بات = ""؛
foreach (System.Xml.XmlNode الثانية في lst)
{
System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
foreach (System.Xml.XmlNode chk in sub)
{
بات = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = new 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);
}
}
}
عودة فارغة
}
IHttpModule.Init باطلة (سياق HttpApplication)
{
context.BeginRequest += مندوب (مرسل الكائن، EventArgs e)
{
System.Web.HttpContext cxt = context.Context;
إذا (cxt.Request.ContentType != "image/pjpeg")
{
نوع السلسلة = cxt.Request.ContentType.ToLower();
مسار السلسلة = cxt.Request.Path;
سلسلة مسار التطبيق = cxt.Request.ApplicationPath؛
المسار = path.Remove(0, apppath.Length);
المسار = "~" + المسار؛
string newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
إذا (newUrl! = فارغ)
{
cxt.Response.Filter = new 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
{
مرشح الاستجابة العام (System.IO.Stream بالوعة، سلسلة _str)
{
_sink = بالوعة؛
//
// TODO: أضف منطق المنشئ هنا
//
this.str = _str;
}
سلسلة خاصة = ""؛
خاص System.IO.Stream _sink؛
موقف طويل خاص؛
Private System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030");
خاص System.Text.StringBuilder oOutput = جديد System.Text.StringBuilder();
// يجب تجاوز أعضاء الدفق التاليين.
يمكن قراءة منطقية التجاوز العامة
{
الحصول على {العودة الحقيقية}
}
تجاوز منطقي CanSeek العام
{
الحصول على {العودة الحقيقية}
}
تجاوز منطقي CanWrite العام
{
الحصول على {العودة الحقيقية}
}
تجاوز عام طويل
{
الحصول على { العودة 0 }
}
تجاوز عام للموقف الطويل
{
الحصول على { إرجاع _ الموضع }
تعيين { _position = القيمة }
}
تجاوز عام طويل Seek (إزاحة طويلة، اتجاه System.IO.SeekOrigin)
{
return _sink.Seek(offset, Direction);
}
تجاوز عام باطلة SetLength (طول طويل)
{
_sink.SetLength(length);
}
تجاوز عام باطل إغلاق ()
{
_sink.Close();
}
تجاوز عام باطلة فلوش ()
{
_sink.Flush();
}
التجاوز العام قراءة int (بايت [] المخزن المؤقت، إزاحة int، عدد int)
{
return _sink.Read(buffer, offset, count);
}
// تقوم طريقة الكتابة فعليًا بالتصفية.
التجاوز العام للكتابة الفارغة (بايت [] المخزن المؤقت، إزاحة int، عدد int)
{
string szBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
سلسلة ap = "action = ""؛
int pos=-1;
إذا ((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);
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szBuffer);
_sink.Write(data, 0, data.Length);
}
آخر
{
oOutput.Append(szBuffer);
}
// يمكن استخدام الفقرة التالية لتعديل المحتوى بين <Head></head>;
//Regex oEndFile = new Regex("</head>", RegexOptions.IgnoreCase|RegexOptions.Compiled);
//إذا (oEndFile.IsMatch(szBuffer))
//{
// // إلحاق المخزن المؤقت الأخير للبيانات
// // إلحاق الجزء الأخير من البيانات في المخزن المؤقت
// oOutput.Append(szBuffer);
// // استرجع الرد الكامل للعميل
// // نقل بيانات الإرجاع الكاملة للعميل
// string szCompleteBuffer = oOutput.ToString().ToLower();
// int ipos = szCompleteBuffer.IndexOf("<title>");
// int epos = szCompleteBuffer.IndexOf("</title>",ipos+7);
// string 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[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szCompleteBuffer);
// _sink.Write(data, 0, data.Length);
//
//آخر
//{
// oOutput.Append(szBuffer);
//
}
}
////// يتم تكوين قواعد الانتظار على النحو التالي باستخدام ملفات xml؛
بالطبع، يمكنك أيضًا القيام بذلك من خلال قسم التكوين المخصص في web.config
<?xml version="1.0" encoding="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>
</القواعد>
// هذه القاعدة ليست مكتوبة بشكل جيد، على سبيل المثال، يمكن تنفيذ القاعدة الأولى باستخدام تعبير عادي. لكني لا أعرف كيف أكتبها بشكل صحيح في الوقت الحالي، يبدو أنني بحاجة إلى استخدام بعض مفهوم مجموعة مكافحة الالتقاط، وأنا أفكر في هذه الأشياء. !