[转载]asp.net mvc3的静态化实现

[转载]asp.net mvc3的静态化实现 – TerryLiang – 博客园.

静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力。在ASP.NET mvc3中,可以相对容易地处理静态化问题,不用过多考虑静态网页的同步,生成等等问题。我提供这个方法很简单,就需要在需要静态化处理的 Controller或Action上加一个Attribute就可以。下面是我写的一个生成静态文件的ActionFilterAttribute。

<span class="pln">    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">2</span><span class="pln">     </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">3</span><span class="pln">     </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">4</span><span class="pln">     </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Web</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">5</span><span class="pln">     </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Web</span><span class="pun">.</span><span class="typ">Mvc</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">6</span><span class="pln">     </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">NLog</span><span class="pun">;</span><span class="pln">
  </span><span class="lit">7</span><span class="pln">
  </span><span class="lit">8</span><span class="pln">     </span><span class="com">/// <summary></span><span class="pln">
  </span><span class="lit">9</span><span class="pln">     </span><span class="com">/// 生成静态文件</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">     </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">11</span><span class="pln">     </span><span class="pun">[</span><span class="typ">AttributeUsage</span><span class="pun">(</span><span class="typ">AttributeTargets</span><span class="pun">.</span><span class="typ">Class</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">AttributeTargets</span><span class="pun">.</span><span class="typ">Method</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Inherited</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AllowMultiple</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)]</span><span class="pln">
 </span><span class="lit">12</span><span class="pln">     </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">GenerateStaticFileAttribute</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ActionFilterAttribute</span><span class="pln">
 </span><span class="lit">13</span><span class="pln">     </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">14</span><span class="pln">         </span><span class="com">#region 私有属性</span><span class="pln">
 </span><span class="lit">15</span><span class="pln">
 </span><span class="lit">16</span><span class="pln">         </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">readonly</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> logger </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LogManager</span><span class="pun">.</span><span class="typ">GetCurrentClassLogger</span><span class="pun">();</span><span class="pln">
 </span><span class="lit">17</span><span class="pln">
 </span><span class="lit">18</span><span class="pln">         </span><span class="com">#endregion</span><span class="pln">
 </span><span class="lit">19</span><span class="pln">
 </span><span class="lit">20</span><span class="pln">         </span><span class="com">#region 公共属性</span><span class="pln">
 </span><span class="lit">21</span><span class="pln">
 </span><span class="lit">22</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">23</span><span class="pln">         </span><span class="com">/// 过期时间,以小时为单位</span><span class="pln">
 </span><span class="lit">24</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">25</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Expiration</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">26</span><span class="pln">
 </span><span class="lit">27</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">28</span><span class="pln">         </span><span class="com">/// 文件后缀名</span><span class="pln">
 </span><span class="lit">29</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">30</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">Suffix</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">31</span><span class="pln">
 </span><span class="lit">32</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">33</span><span class="pln">         </span><span class="com">/// 缓存目录</span><span class="pln">
 </span><span class="lit">34</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">35</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">CacheDirectory</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">36</span><span class="pln">
 </span><span class="lit">37</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">38</span><span class="pln">         </span><span class="com">/// 指定生成的文件名</span><span class="pln">
 </span><span class="lit">39</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">40</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">FileName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">41</span><span class="pln">
 </span><span class="lit">42</span><span class="pln">         </span><span class="com">#endregion</span><span class="pln">
 </span><span class="lit">43</span><span class="pln">
 </span><span class="lit">44</span><span class="pln">         </span><span class="com">#region 构造函数</span><span class="pln">
 </span><span class="lit">45</span><span class="pln">
 </span><span class="lit">46</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">47</span><span class="pln">         </span><span class="com">/// 默认构造函数</span><span class="pln">
 </span><span class="lit">48</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">49</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">GenerateStaticFileAttribute</span><span class="pun">()</span><span class="pln">
 </span><span class="lit">50</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">51</span><span class="pln">             </span><span class="typ">Expiration</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">52</span><span class="pln">             </span><span class="typ">CacheDirectory</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AppDomain</span><span class="pun">.</span><span class="typ">CurrentDomain</span><span class="pun">.</span><span class="typ">BaseDirectory</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">53</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">54</span><span class="pln">
 </span><span class="lit">55</span><span class="pln">         </span><span class="com">#endregion</span><span class="pln">
 </span><span class="lit">56</span><span class="pln">
 </span><span class="lit">57</span><span class="pln">         </span><span class="com">#region 方法</span><span class="pln">
 </span><span class="lit">58</span><span class="pln">
 </span><span class="lit">59</span><span class="pln">         </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">override</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnResultExecuted</span><span class="pun">(</span><span class="typ">ResultExecutedContext</span><span class="pln"> filterContext</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">60</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">61</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> fileInfo </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GetCacheFileInfo</span><span class="pun">(</span><span class="pln">filterContext</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">62</span><span class="pln">
 </span><span class="lit">63</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">fileInfo</span><span class="pun">.</span><span class="typ">Exists</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> fileInfo</span><span class="pun">.</span><span class="typ">CreationTime</span><span class="pun">.</span><span class="typ">AddHours</span><span class="pun">(</span><span class="typ">Expiration</span><span class="pun">)</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">Now</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">!</span><span class="pln">fileInfo</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">64</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">65</span><span class="pln">                 </span><span class="kwd">var</span><span class="pln"> deleted </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">66</span><span class="pln">
 </span><span class="lit">67</span><span class="pln">                 </span><span class="kwd">try</span><span class="pln">
 </span><span class="lit">68</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">69</span><span class="pln">                     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fileInfo</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">70</span><span class="pln">                     </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">71</span><span class="pln">                         fileInfo</span><span class="pun">.</span><span class="typ">Delete</span><span class="pun">();</span><span class="pln">
 </span><span class="lit">72</span><span class="pln">                     </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">73</span><span class="pln">
 </span><span class="lit">74</span><span class="pln">                     deleted </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">75</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">76</span><span class="pln">                 </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> ex</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">77</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">78</span><span class="pln">                     logger</span><span class="pun">.</span><span class="typ">Error</span><span class="pun">(</span><span class="str">"删除文件:{0}发生异常:{1}"</span><span class="pun">,</span><span class="pln"> fileInfo</span><span class="pun">.</span><span class="typ">FullName</span><span class="pun">,</span><span class="pln"> ex</span><span class="pun">.</span><span class="typ">StackTrace</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">79</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">80</span><span class="pln">
 </span><span class="lit">81</span><span class="pln">                 </span><span class="kwd">var</span><span class="pln"> created </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">82</span><span class="pln">
 </span><span class="lit">83</span><span class="pln">                 </span><span class="kwd">try</span><span class="pln">
 </span><span class="lit">84</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">85</span><span class="pln">                     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">fileInfo</span><span class="pun">.</span><span class="typ">Directory</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">86</span><span class="pln">                     </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">87</span><span class="pln">                         fileInfo</span><span class="pun">.</span><span class="typ">Directory</span><span class="pun">.</span><span class="typ">Create</span><span class="pun">();</span><span class="pln">
 </span><span class="lit">88</span><span class="pln">                     </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">89</span><span class="pln">
 </span><span class="lit">90</span><span class="pln">                     created </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">91</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">92</span><span class="pln">                 </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> ex</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">93</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">94</span><span class="pln">                     logger</span><span class="pun">.</span><span class="typ">Error</span><span class="pun">(</span><span class="str">"创建目录:{0}发生异常:{1}"</span><span class="pun">,</span><span class="pln"> fileInfo</span><span class="pun">.</span><span class="typ">DirectoryName</span><span class="pun">,</span><span class="pln"> ex</span><span class="pun">.</span><span class="typ">StackTrace</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">95</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">96</span><span class="pln">
 </span><span class="lit">97</span><span class="pln">                 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">deleted </span><span class="pun">&&</span><span class="pln"> created</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">98</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">99</span><span class="pln">                     </span><span class="typ">FileStream</span><span class="pln"> fileStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="lit">100</span><span class="pln">                     </span><span class="typ">StreamWriter</span><span class="pln"> streamWriter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="lit">101</span><span class="pln">
</span><span class="lit">102</span><span class="pln">                     </span><span class="kwd">try</span><span class="pln">
</span><span class="lit">103</span><span class="pln">                     </span><span class="pun">{</span><span class="pln">
</span><span class="lit">104</span><span class="pln">                         </span><span class="kwd">var</span><span class="pln"> viewResult </span><span class="pun">=</span><span class="pln"> filterContext</span><span class="pun">.</span><span class="typ">Result</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> </span><span class="typ">ViewResult</span><span class="pun">;</span><span class="pln">
</span><span class="lit">105</span><span class="pln">                         fileStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileStream</span><span class="pun">(</span><span class="pln">fileInfo</span><span class="pun">.</span><span class="typ">FullName</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FileMode</span><span class="pun">.</span><span class="typ">CreateNew</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FileAccess</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FileShare</span><span class="pun">.</span><span class="kwd">None</span><span class="pun">);</span><span class="pln">
</span><span class="lit">106</span><span class="pln">                         streamWriter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamWriter</span><span class="pun">(</span><span class="pln">fileStream</span><span class="pun">);</span><span class="pln">
</span><span class="lit">107</span><span class="pln">                         </span><span class="kwd">var</span><span class="pln"> viewContext </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ViewContext</span><span class="pun">(</span><span class="pln">filterContext</span><span class="pun">.</span><span class="typ">Controller</span><span class="pun">.</span><span class="typ">ControllerContext</span><span class="pun">,</span><span class="pln"> viewResult</span><span class="pun">.</span><span class="typ">View</span><span class="pun">,</span><span class="pln"> viewResult</span><span class="pun">.</span><span class="typ">ViewData</span><span class="pun">,</span><span class="pln"> viewResult</span><span class="pun">.</span><span class="typ">TempData</span><span class="pun">,</span><span class="pln"> streamWriter</span><span class="pun">);</span><span class="pln">
</span><span class="lit">108</span><span class="pln">                         viewResult</span><span class="pun">.</span><span class="typ">View</span><span class="pun">.</span><span class="typ">Render</span><span class="pun">(</span><span class="pln">viewContext</span><span class="pun">,</span><span class="pln"> streamWriter</span><span class="pun">);</span><span class="pln">
</span><span class="lit">109</span><span class="pln">                     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">110</span><span class="pln">                     </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> ex</span><span class="pun">)</span><span class="pln">
</span><span class="lit">111</span><span class="pln">                     </span><span class="pun">{</span><span class="pln">
</span><span class="lit">112</span><span class="pln">                         logger</span><span class="pun">.</span><span class="typ">Error</span><span class="pun">(</span><span class="str">"生成缓存文件:{0}发生异常:{1}"</span><span class="pun">,</span><span class="pln"> fileInfo</span><span class="pun">.</span><span class="typ">FullName</span><span class="pun">,</span><span class="pln"> ex</span><span class="pun">.</span><span class="typ">StackTrace</span><span class="pun">);</span><span class="pln">
</span><span class="lit">113</span><span class="pln">                     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">114</span><span class="pln">                     </span><span class="kwd">finally</span><span class="pln">
</span><span class="lit">115</span><span class="pln">                     </span><span class="pun">{</span><span class="pln">
</span><span class="lit">116</span><span class="pln">                         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">streamWriter </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">117</span><span class="pln">                         </span><span class="pun">{</span><span class="pln">
</span><span class="lit">118</span><span class="pln">                             streamWriter</span><span class="pun">.</span><span class="typ">Close</span><span class="pun">();</span><span class="pln">
</span><span class="lit">119</span><span class="pln">                         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">120</span><span class="pln">
</span><span class="lit">121</span><span class="pln">                         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fileStream </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">122</span><span class="pln">                         </span><span class="pun">{</span><span class="pln">
</span><span class="lit">123</span><span class="pln">                             fileStream</span><span class="pun">.</span><span class="typ">Close</span><span class="pun">();</span><span class="pln">
</span><span class="lit">124</span><span class="pln">                         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">125</span><span class="pln">                     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">126</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
</span><span class="lit">127</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">128</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">129</span><span class="pln">
</span><span class="lit">130</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
</span><span class="lit">131</span><span class="pln">         </span><span class="com">/// 生成文件Key</span><span class="pln">
</span><span class="lit">132</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
</span><span class="lit">133</span><span class="pln">         </span><span class="com">/// <param name="controllerContext">ControllerContext</param></span><span class="pln">
</span><span class="lit">134</span><span class="pln">         </span><span class="com">/// <returns>文件Key</returns></span><span class="pln">
</span><span class="lit">135</span><span class="pln">         </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">virtual</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">GenerateKey</span><span class="pun">(</span><span class="typ">ControllerContext</span><span class="pln"> controllerContext</span><span class="pun">)</span><span class="pln">
</span><span class="lit">136</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
</span><span class="lit">137</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> url </span><span class="pun">=</span><span class="pln"> controllerContext</span><span class="pun">.</span><span class="typ">HttpContext</span><span class="pun">.</span><span class="typ">Request</span><span class="pun">.</span><span class="typ">Url</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">();</span><span class="pln">
</span><span class="lit">138</span><span class="pln">
</span><span class="lit">139</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">IsNullOrWhiteSpace</span><span class="pun">(</span><span class="pln">url</span><span class="pun">))</span><span class="pln">
</span><span class="lit">140</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">141</span><span class="pln">                 </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="lit">142</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">143</span><span class="pln">
</span><span class="lit">144</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> th </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TigerHash</span><span class="pun">();</span><span class="pln">
</span><span class="lit">145</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> th</span><span class="pun">.</span><span class="typ">ComputeHash</span><span class="pun">(</span><span class="typ">Encoding</span><span class="pun">.</span><span class="typ">Unicode</span><span class="pun">.</span><span class="typ">GetBytes</span><span class="pun">(</span><span class="pln">url</span><span class="pun">));</span><span class="pln">
</span><span class="lit">146</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> key </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Convert</span><span class="pun">.</span><span class="typ">ToBase64String</span><span class="pun">(</span><span class="pln">data</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Base64FormattingOptions</span><span class="pun">.</span><span class="kwd">None</span><span class="pun">);</span><span class="pln">
</span><span class="lit">147</span><span class="pln">             key </span><span class="pun">=</span><span class="pln"> </span><span class="typ">HttpUtility</span><span class="pun">.</span><span class="typ">UrlEncode</span><span class="pun">(</span><span class="pln">key</span><span class="pun">);</span><span class="pln">
</span><span class="lit">148</span><span class="pln">
</span><span class="lit">149</span><span class="pln">             </span><span class="kwd">return</span><span class="pln"> key</span><span class="pun">;</span><span class="pln">
</span><span class="lit">150</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">151</span><span class="pln">
</span><span class="lit">152</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
</span><span class="lit">153</span><span class="pln">         </span><span class="com">/// 获取静态的文件信息</span><span class="pln">
</span><span class="lit">154</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
</span><span class="lit">155</span><span class="pln">         </span><span class="com">/// <param name="controllerContext">ControllerContext</param></span><span class="pln">
</span><span class="lit">156</span><span class="pln">         </span><span class="com">/// <returns>缓存文件信息</returns></span><span class="pln">
</span><span class="lit">157</span><span class="pln">         </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">virtual</span><span class="pln"> </span><span class="typ">FileInfo</span><span class="pln"> </span><span class="typ">GetCacheFileInfo</span><span class="pun">(</span><span class="typ">ControllerContext</span><span class="pln"> controllerContext</span><span class="pun">)</span><span class="pln">
</span><span class="lit">158</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
</span><span class="lit">159</span><span class="pln">             </span><span class="kwd">var</span><span class="pln"> fileName </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Empty</span><span class="pun">;</span><span class="pln">
</span><span class="lit">160</span><span class="pln">
</span><span class="lit">161</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">IsNullOrWhiteSpace</span><span class="pun">(</span><span class="typ">FileName</span><span class="pun">))</span><span class="pln">
</span><span class="lit">162</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">163</span><span class="pln">                 </span><span class="kwd">var</span><span class="pln"> key </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GenerateKey</span><span class="pun">(</span><span class="pln">controllerContext</span><span class="pun">);</span><span class="pln">
</span><span class="lit">164</span><span class="pln">
</span><span class="lit">165</span><span class="pln">                 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">IsNullOrWhiteSpace</span><span class="pun">(</span><span class="pln">key</span><span class="pun">))</span><span class="pln">
</span><span class="lit">166</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
</span><span class="lit">167</span><span class="pln">                     fileName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Path</span><span class="pun">.</span><span class="typ">Combine</span><span class="pun">(</span><span class="typ">CacheDirectory</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">.</span><span class="typ">IsNullOrWhiteSpace</span><span class="pun">(</span><span class="typ">Suffix</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> key </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0}.{1}"</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Suffix</span><span class="pun">));</span><span class="pln">
</span><span class="lit">168</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
</span><span class="lit">169</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">170</span><span class="pln">             </span><span class="kwd">else</span><span class="pln">
</span><span class="lit">171</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">172</span><span class="pln">                 fileName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Path</span><span class="pun">.</span><span class="typ">Combine</span><span class="pun">(</span><span class="typ">CacheDirectory</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FileName</span><span class="pun">);</span><span class="pln">
</span><span class="lit">173</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">174</span><span class="pln">
</span><span class="lit">175</span><span class="pln">             </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FileInfo</span><span class="pun">(</span><span class="pln">fileName</span><span class="pun">);</span><span class="pln">
</span><span class="lit">176</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">177</span><span class="pln">
</span><span class="lit">178</span><span class="pln">         </span><span class="com">#endregion</span><span class="pln">
</span><span class="lit">179</span><span class="pln">     </span><span class="pun">}</span>

如果大家对于生成的文件和目录有特殊的要求,那可以重写GetCacheFileInfo方法,比如按照日期生成目录等等更复杂的目录和文件结构。当然以上代码只是提供了生成静态页的方法,但是访问如何解决呢? 访问静态文件和规则就需要在HttpApplication的Application_BeginRequest实现了。首先可以设置需要静态化访问的路由地址以html结尾。下面的是一个用于首页的静态化访问的实现,很简单,当然你可以实现比较复杂的逻辑,比如根据文件时间来判断是否应该访问静态文件等等。

<span class="pln">       </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Application_BeginRequest</span><span class="pun">(</span><span class="kwd">object</span><span class="pln"> sender</span><span class="pun">,</span><span class="pln"> </span><span class="typ">EventArgs</span><span class="pln"> e</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">2</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">3</span><span class="pln">             </span><span class="typ">StaticContentRewrite</span><span class="pun">();</span><span class="pln">
 </span><span class="lit">4</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">5</span><span class="pln">
 </span><span class="lit">6</span><span class="pln">         </span><span class="com">/// <summary></span><span class="pln">
 </span><span class="lit">7</span><span class="pln">         </span><span class="com">/// 处理静态发布内容</span><span class="pln">
 </span><span class="lit">8</span><span class="pln">         </span><span class="com">/// </summary></span><span class="pln">
 </span><span class="lit">9</span><span class="pln">         </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">StaticContentRewrite</span><span class="pun">()</span><span class="pln">
</span><span class="lit">10</span><span class="pln">         </span><span class="pun">{</span><span class="pln">
</span><span class="lit">11</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Context</span><span class="pun">.</span><span class="typ">Request</span><span class="pun">.</span><span class="typ">FilePath</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"/"</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="typ">Context</span><span class="pun">.</span><span class="typ">Request</span><span class="pun">.</span><span class="typ">FilePath</span><span class="pun">.</span><span class="typ">StartsWith</span><span class="pun">(</span><span class="str">"/index.html"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">OrdinalIgnoreCase</span><span class="pun">))</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">                 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">File</span><span class="pun">.</span><span class="typ">Exists</span><span class="pun">(</span><span class="typ">Server</span><span class="pun">.</span><span class="typ">MapPath</span><span class="pun">(</span><span class="str">"index.html"</span><span class="pun">)))</span><span class="pln">
</span><span class="lit">14</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">                     </span><span class="typ">Context</span><span class="pun">.</span><span class="typ">RewritePath</span><span class="pun">(</span><span class="str">"index.html"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">18</span><span class="pln">         </span><span class="pun">}</span><span class="pln"> </span>
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册