urlMappings ใน asp.net2.0 นั้นใช้งานง่ายมาก แต่น่าเสียดายที่มันไม่รองรับนิพจน์ทั่วไป อย่างไรก็ตาม โชคดีหากคุณใช้ IHttpModule
ไม่ว่าจะเป็นคำขอประเภทใดก็ตาม มันจะผ่าน IHttpModule ก่อน ซึ่งให้ผลดี โอกาสในการเขียน URL ใหม่ :
ต่อไปนี้เป็น IHttpModule ที่ฉันเขียน:
การใช้ระบบ;
ใช้ System.Web;
ReWriteModule: IHttpModule คลาสสาธารณะ
-
ReWriteModule สาธารณะ ()
-
-
สตริงการแทนที่สาธารณะ ToString()
-
ส่งคืน this.GetType().ToString();
-
เป็นโมฆะ IHttpModule.Dispose()
-
-
System.Xml.XmlDocument ส่วนตัวแบบคงที่ lawDoc = null;
System.Xml.XmlDocument GetRuleConfig แบบคงที่ส่วนตัว (แอป System.Web.HttpContext)
-
ถ้า (ruleDoc == null)
-
RuleDoc = 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 nd ใน lst)
-
System.Xml.XmlNodeList ย่อย = nd.ChildNodes[0].ChildNodes;
foreach (System.Xml.XmlNode chk ในย่อย)
-
ตบ = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = ใหม่ System.Text.RegularExpressions.Regex (pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
ถ้า (reg.IsMatch (เส้นทาง))
-
กลับ reg.Replace (เส้นทาง nd.ChildNodes [1] .InnerText);
-
-
-
กลับเป็นโมฆะ;
}
เป็นโมฆะ IHttpModule.Init (บริบท HttpApplication)
-
context.BeginRequest += ผู้รับมอบสิทธิ์ (ผู้ส่งวัตถุ EventArgs e)
-
System.Web.HttpContext cxt = บริบทบริบท;
ถ้า (cxt.Request.ContentType != "image/pjpeg")
-
ประเภทสตริง = cxt.Request.ContentType.ToLower();
เส้นทางสตริง = cxt.Request.Path;
apppath สตริง = cxt.Request.ApplicationPath;
path = path.Remove (0, apppath.Length);
เส้นทาง = "~" + เส้นทาง;
สตริง newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
ถ้า (newUrl != null)
-
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 ใหม่แล้ว การดำเนินการใน WEBFORM ดั้งเดิมจะเปลี่ยนไป ซึ่งอาจทำให้เกิดได้ง่าย: ไม่มีทรัพยากรที่ร้องขอ
อะไรเป็นพิเศษ มันจะชัดเจนถ้าคุณ DX ลองดูสิ! - -
ทั้งหมดที่เรามีคือ ResponseFilter นี้ ซึ่งมีการใช้งานดังต่อไปนี้
คลาสสาธารณะ ResponseFilter:System.IO.Stream
-
ResponseFilter สาธารณะ (System.IO.Stream sink, string _str)
-
_sink = จม;
-
// สิ่งที่ต้องทำ: เพิ่มตรรกะคอนสตรัคเตอร์ที่นี่
-
นี่.str = _str;
-
สตริงส่วนตัว str = "";
System.IO.Stream ส่วนตัว _sink;
_position ยาวส่วนตัว;
ส่วนตัว System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030");
System.Text.StringBuilder ส่วนตัว oOutput = System.Text.StringBuilder ใหม่ ();
// สมาชิกของ Stream ต่อไปนี้จะต้องถูกแทนที่
บูลแทนที่สาธารณะ CanRead
-
รับ { คืนค่าจริง }
}
บูลแทนที่สาธารณะ CanSeek
-
รับ { คืนค่าจริง }
}
บูลแทนที่สาธารณะ CanWrite
-
รับ { คืนค่าจริง }
}
สาธารณะแทนที่ความยาวแบบยาว
-
รับ { กลับ 0;
}
สาธารณะแทนที่ตำแหน่งยาว
-
รับ { กลับ _position;
ตั้งค่า { _position = ค่า; }
}
สาธารณะแทนที่การค้นหาแบบยาว (ออฟเซ็ตแบบยาว, ทิศทาง System.IO.SeekOrigin)
-
return _sink.Seek (ออฟเซ็ต, ทิศทาง);
}
สาธารณะแทนที่เป็นโมฆะ SetLength (ความยาวยาว)
-
_sink.SetLength(ความยาว);
}
แทนที่สาธารณะถือเป็นโมฆะปิด ()
-
_sink.ปิด();
}
การแทนที่สาธารณะเป็นโมฆะ Flush()
-
_sink.ฟลัช();
}
แทนที่สาธารณะ int Read (ไบต์ [] บัฟเฟอร์, int offset, int count)
-
return _sink.Read (บัฟเฟอร์, ออฟเซ็ต, นับ);
}
// เมธอด Write ทำการกรองจริง ๆ
การแทนที่สาธารณะเป็นโมฆะเขียน (ไบต์ [] บัฟเฟอร์, ออฟเซ็ต int, นับ int)
-
string szBuffer = System.Text.UTF8Encoding.UTF8.GetString (บัฟเฟอร์, ออฟเซ็ต, นับ);
สตริง ap="การกระทำ="";
int pos=-1;
ถ้า ((pos=szBuffer.IndexOf(ap) )!= -1)
-
int epos = szBuffer.IndexOf(""", pos + ap.Length+1);
ถ้า (epos != -1)
-
szBuffer= szBuffer.Remove(pos + ap.Length, epos - pos - ap.Length);
}
szBuffer = szBuffer.Insert (pos + ap.Length, this.str);
ไบต์ [] ข้อมูล = System.Text.UTF8Encoding.UTF8.GetBytes (szBuffer);
_sink.Write (ข้อมูล, 0, ข้อมูลความยาว);
-
อื่น
-
oOutput.ผนวก(szBuffer);
}
//ย่อหน้าต่อไปนี้สามารถใช้เพื่อแก้ไขเนื้อหาระหว่าง <Head></head>;
//Regex oEndFile = Regex ใหม่ ("</ head>", RegexOptions.IgnoreCase|RegexOptions.Compiled);
//ถ้า (oEndFile.IsMatch(szBuffer))
-
// // ผนวกบัฟเฟอร์สุดท้ายของข้อมูล
// //ผนวกส่วนสุดท้ายของข้อมูลในบัฟเฟอร์
// oOutput.Append(szBuffer);
// //รับการตอบกลับที่สมบูรณ์สำหรับลูกค้า
// //ส่งข้อมูลการส่งคืนไคลเอ็นต์ที่สมบูรณ์
// string szCompleteBuffer = oOutput.ToString().ToLower();
// int ipos = szCompleteBuffer.IndexOf("<ชื่อ>");
// 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");
// //ไม่ตรงกัน ดังนั้นเขียนข้อมูลต้นฉบับออกมา
// //ไม่ตรงกัน ดังนั้นจึงเขียนซอร์สโค้ด
// ไบต์ [] ข้อมูล = System.Text.UTF8Encoding.UTF8.GetBytes (szCompleteBuffer);
// _sink.Write (ข้อมูล, 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>
</กฎนักเขียนใหม่>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/pc</LookFor>
</มองหา>
<SendTo>~/Test2.aspx</SendTo>
</กฎนักเขียนใหม่>
</กฎ>
//กฎข้อนี้เขียนได้ไม่ดีนัก ตัวอย่างเช่น ข้อแรกสามารถทำได้ด้วยนิพจน์ทั่วไป แต่ตอนนี้ฉันไม่รู้วิธีเขียนอย่างถูกต้อง ดูเหมือนว่าฉันจำเป็นต้องใช้แนวคิดของกลุ่มต่อต้านการจับ ฉันกำลังคิดเกี่ยวกับเรื่องนี้! -