一直都在使用微軟URLRewriter,具體的使用方法我就不多說了,網上文章很多。
但最近遇到一個問題,就是當web.config文件里面設置偽靜態規則過多,大於2M的時候,就報錯:無法讀取配置文件,因為它超過了最大文件大小的解決辦法,如圖:
URLRewriting所有的映射規則都是保存在web.config里面的,導致這個文件過大,所以最好的解決辦法就是把里面的映射規則保存到另外一個文件中去。
1、下載和安裝MSDNURLRewriting.msi地址
2、打開源碼 Config/RewriterConfiguration.cs 找到下面代碼,
/// <summary> /// GetConfig() returns an instance of the <b>RewriterConfiguration</b> class with the values populated from /// the Web.config file. It uses XML deserialization to convert the XML structure in Web.config into /// a <b>RewriterConfiguration</b> instance. /// </summary> /// <returns>A <see cref="RewriterConfiguration"/> instance.</returns> public static RewriterConfiguration GetConfig() { if (HttpContext.Current.Cache["RewriterConfig"] == null) HttpContext.Current.Cache.Insert("RewriterConfig", ConfigurationSettings.GetConfig("RewriterConfig")); return (RewriterConfiguration) HttpContext.Current.Cache["RewriterConfig"]; }
修改為
/// <summary> /// GetConfig() returns an instance of the <b>RewriterConfiguration</b> class with the values populated from /// the Web.config file. It uses XML deserialization to convert the XML structure in Web.config into /// a <b>RewriterConfiguration</b> instance. /// </summary> /// <returns>A <see cref="RewriterConfiguration"/> instance.</returns> public static RewriterConfiguration GetConfig() { if (HttpContext.Current.Cache["RewriterConfig"] == null) { object obj = Acexe.Common.APIXMLSerializer.DeSerializeFromFile(HttpContext.Current.Server.MapPath("~/URLRewriter.config"), typeof(RewriterConfiguration)); HttpContext.Current.Cache.Insert("RewriterConfig", obj); } return (RewriterConfiguration)HttpContext.Current.Cache["RewriterConfig"]; }
其中,反序列化類:
using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Acexe.Common { public class APIXMLSerializer { public static object DeSerialize(string xml, Type type) { return DeSerialize(xml, type, Encoding.UTF8); } public static object DeSerialize(string xml, Type type, Encoding encode) { return DeSerialize(xml, type, encode, false); } public static object DeSerialize(string xml, Type type, Encoding encode, bool needException) { try { XmlSerializer serializer = new XmlSerializer(type); MemoryStream stream = new MemoryStream(encode.GetBytes(xml)); object obj2 = serializer.Deserialize(stream); stream.Close(); stream.Dispose(); return obj2; } catch (Exception) { return null; } } public static object DeSerializeFromFile(string filepath, Type type) { try { XmlSerializer serializer = new XmlSerializer(type); FileStream stream = new FileStream(filepath, FileMode.Open); object obj2 = serializer.Deserialize(stream); stream.Close(); stream.Dispose(); return obj2; } catch (Exception) { return null; } } public static object DeSerializeUTF8(string xml, Type type) { return DeSerialize(xml, type, Encoding.UTF8); } public static string Serialize(object ob) { return Serialize(ob, ob.GetType(), Encoding.UTF8); } public static string Serialize(object ob, Type type) { return Serialize(ob, type, Encoding.UTF8); } public static string Serialize(object ob, Type type, Encoding encode) { try { XmlSerializer serializer = new XmlSerializer(type); XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); XmlWriterSettings settings = new XmlWriterSettings(); MemoryStream output = new MemoryStream(); settings.OmitXmlDeclaration = true; XmlWriter xmlWriter = XmlWriter.Create(output, settings); serializer.Serialize(xmlWriter, ob, namespaces); xmlWriter.Flush(); xmlWriter.Close(); string str = encode.GetString(output.GetBuffer()); output.Close(); output.Dispose(); return str.TrimEnd(new char[1]); } catch (Exception) { return ""; } } public static void SerializeToFile(object ob, Type type, string filepath) { try { XmlSerializer serializer = new XmlSerializer(type); StreamWriter writer = new StreamWriter(filepath); serializer.Serialize((TextWriter)writer, ob); writer.Close(); writer.Dispose(); } catch (Exception) { } } public static string SerializeUTF8(object ob, Type type) { return Serialize(ob, type, Encoding.UTF8); } } }
3、配置偽靜態規則到網站根目錄下URLRewriter.config(路徑根據實際需要可調整)
<?xml version="1.0"?> <RewriterConfig> <Rules> <!--首頁--> <RewriterRule> <LookFor>~/index.html</LookFor> <SendTo>~/default.aspx</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Vacations/(.[0-9]*)S(.[0-9]*)A(.[0-9]*)C(.[0-9]*)D(.[0-9]*)E(.[0-9]*)F(.[0-9]*)H(.[0-9]*)J(.[0-9]*)R(.[0-9]*)T(.[0-9]*)W(.[0-9]*)X(.[0-9]*)Y(.[0-9]*)P(.[0-9]*)/index.html</LookFor> <SendTo>~/Vacations/List.aspx?sid=$1&A=$3&C=$4&D=$5&E=$6&F=$7&H=$8&J=$9&R=$10&T=$11&W=$12&X=$13&Y=$14&P=$15</SendTo> </RewriterRule> </Rules> </RewriterConfig>
4、配置Web.Config文件(和網上其他說明的配置一樣)
(1)添加下面內容到configSections節點下
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>
(2)添加下面內容到httpHandlers節點下
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/> <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>
(3)如果是IIS7,添加下面內容到handlers節點下
<!--IIS7URL重寫配置開始--> <add name="all" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness64" /> <add name="Html" path="*.html" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" /> <add name="ASPNET_ISAPI" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" /> <!--IIS7URL重寫配置結束—>
以下是全部Web.Config文件配置
<?xml version="1.0"?> <!-- 注意: 除了手動編輯此文件外,您還可以使用 Web 管理工具來配置應用程序的設置。可以使用 Visual Studio 中的 “網站”->“Asp.Net 配置”選項。 設置和注釋的完整列表可以在 machine.config.comments 中找到,該文件通常位於 \Windows\Microsoft.Net\Framework\vx.x\Config 中 --> <configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/> </configSections> <system.web> <!-- 設置 compilation debug="true" 可將調試符號插入到 已編譯的頁面。由於這會 影響性能,因此請僅在開發過程中將此值 設置為 true。 --> <compilation debug="true"> <assemblies> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> </assemblies> <buildProviders> <add extension=".html" type="System.Web.Compilation.PageBuildProvider" /> </buildProviders> </compilation> <!-- 通過 <authentication> 節可以配置 安全身份驗證模式,ASP.NET 使用該模式來識別來訪用戶身份。 --> <authentication mode="Windows"/> <!-- 如果在執行請求的過程中出現未處理的錯誤, 則通過 <customErrors> 節 可以配置相應的處理步驟。具體而言, 開發人員通過該節可配置要顯示的 html 錯誤頁, 以代替錯誤堆棧跟蹤。 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </controls> </pages> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/> <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/> </httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules> </system.web> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/> </compiler> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="OptionInfer" value="true"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom> <!-- system.webServer 節是在 Internet Information Services 7.0 下運行 ASP.NET AJAX 所必需的。對早期版本的 IIS 來說則不需要此節。 --> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name="ScriptModule"/> <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </modules> <handlers> <remove name="WebServiceHandlerFactory-Integrated"/> <remove name="ScriptHandlerFactory"/> <remove name="ScriptHandlerFactoryAppServices"/> <remove name="ScriptResource"/> <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <!--IIS7URL重寫配置開始--> <add name="all" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness64" /> <add name="Html" path="*.html" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" /> <add name="ASPNET_ISAPI" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" /> <!--IIS7URL重寫配置結束--> </handlers> <defaultDocument> <files> <clear /> <add value="default.aspx" /> <add value="index.html" /> <add value="index.asp" /> </files> </defaultDocument> </system.webServer> <runtime> <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
三五旅游網 http://www.35lvyou.com