星期日, 12月 05, 2010

[Asp.Net] URL Rewrite 懶人包心得

記錄使用rewrite相關問題解法。
最後使用免費的套件來ISAPIRewrite處理
(如有其他需求可參考這篇Tip/Trick: Url Rewriting with ASP.NET )
不過順利解決完rewrite的問題後。
又遇到二個問題需要處理lol~不過解法都在找到的資料裡面,
以下只是記錄一下流程跟心得:)



問題一:如何處理rewrite後的postback問題


Step1:先新增一個class:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

// Original code here: 
//http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(new RewriteFormHtmlTextWriter(writer));
    }
}

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
    public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
        : base(writer)
    {
        this.InnerWriter = writer.InnerWriter;
    }

    public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
        : base(writer)
    {
        base.InnerWriter = writer;
    }

    public override void WriteAttribute(string name, string value, bool fEncode)
    {
        // If the attribute we are writing is the "action" attribute, and we are not on a sub-control,
        // then replace the value to write with the raw URL of the request - which ensures that we'll
        // preserve the PathInfo value on postback scenarios

        if (name == "action")
        {
            HttpContext context = HttpContext.Current;

            if (context.Items["ActionAlreadyWritten"] == null)
            {
                // Because we are using an url reweriting HttpModule, we will use the
                // Request.RawUrl property within ASP.NET to retrieve the origional URL
                // before it was re-written.  You'll want to change the line of code below
                // if you use a different URL rewriting implementation.

                // value = context.Request.RawUrl;
                value = context.Request.ServerVariables["HTTP_X_REWRITE_URL"];

                // Indicate that we've already rewritten the 
's action attribute to prevent // us from rewriting a sub-control under the control context.Items["ActionAlreadyWritten"] = true; } } base.WriteAttribute(name, value, fEncode); } }
FormRewriterControlAdapter.cs,並將它放到App_Code資料夾




Step2:新增Asp.net的App_Browsers


Step3:於App_Browsers內新增Form.browser,並新增以下內容
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
          adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

問題二:如何處理rewrite過後正確的參考到資源(javascript、css、images 如果是Asp.net Controls的話,只要加入~的符號就能正確參考到該資源檔了
 <img id="userAvatar" runat="server" src="~/images/pic.jpg" width="50" visible="false">
另外我的javascript的include方式,因為不是用asp.net元件(沒試著加runat="server"),所以就從/開始指到資源檔就正確了
    <script type="text/javascript" src="/js/plugin/jquery.copy.js"></script>
)


Reference:
URL Rewriting for ASP.NET Web Forms
Tip/Trick: Url Rewriting with ASP.NET 
Handling ASP.NET PostBacks with URL RewritingA Complete URL Rewriting Solution for ASP.NET 2.0
ASP.NET URL Rewrite. URL重写 

沒有留言:

張貼留言

留個話吧:)