国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

asp.net中的ResolveUrl 完美解決方案

2019-11-17 03:51:30
字體:
供稿:網(wǎng)友
   根據(jù)我個人使用asp.net的經(jīng)驗,和通過在網(wǎng)上搜索。我發(fā)現(xiàn),Page的ResolveUrl方法給我們帶來了一些比較嚴重的問題。

     最常見的問題是在頁面或控件以外的范圍不能使用它。

     其他的問題都是bug。如它不能正確處理一些你給的URL。例如,嘗試 Page.ResolveUrl("~/test.aspx?param=http://www.test.com")。結(jié)果與你輸入字符串相同,沒做任何變動。使用Reflector查看asp.net代碼,我發(fā)現(xiàn)將相對URL轉(zhuǎn)換為絕對URL機制都是先搜索string中的 "://",如果找到,就直接返回了。因此,如果你傳遞一個帶://的參數(shù),查詢字符串就是OK的。我們都知道的查詢字符串參數(shù)應(yīng)進行urlencode,但如果沒有,它應(yīng)該仍然是可以接受URL。嚴重的是,要檢查您的瀏覽器。

   網(wǎng)上,建議的方法是使用VirtualPathUtility.ToAbsolute,如果你在傳遞URL作為查詢字符串,這是相當不錯和方便的,...否則,就會引發(fā)異常。如果是一個絕對URL,它也會拋出異常!
   所以,我決定尋求一個最終解決方案。

   首先,我要找搜索一個很好的變量,它能給我們在應(yīng)用程序運行時的虛擬路徑,不使用頁面上下文。

   我使用了HttPRuntime.AppDomainAppVirtualPath。它能在任何地方使用-甚至在timer callback中!它沒有尾隨斜線路徑,ASP.NET作了特素處理,消除斜杠,不過,我們能修復(fù)它:-)

   然后,我使用原ResolveUrl代碼做了一些測試,找到怎么用AppVirtualPath取代:

1、當URL以斜線開始(/或/),也不會改動它!

2、當URL以〜/開始,它會被AppVirtualPath取代。

3、當URL是一個絕對URL,也不會改變它。

4、在任何其他情況下(甚至以〜開始,而不是斜杠),將追加URL到AppVirtualPath。

5、每當它修改URL,還修復(fù)斜杠。刪除雙斜線,用/替換/。

代碼:

代碼
public static string ResolveUrl(string relativeUrl)
{
    if (relativeUrl == null) throw new ArgumentNullException("relativeUrl");

    if (relativeUrl.Length == 0 || relativeUrl[0] == '/' ||
        relativeUrl[0] == '//') return relativeUrl;

    int idxOfScheme =
      relativeUrl.IndexOf(@"://", StringComparison.Ordinal);
    if (idxOfScheme != -1)
    {
        int idxOfQM = relativeUrl.IndexOf('?');
        if (idxOfQM == -1 || idxOfQM > idxOfScheme) return relativeUrl;
    }

    StringBuilder sbUrl = new StringBuilder();
    sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
    if (sbUrl.Length == 0 || sbUrl[sbUrl.Length - 1] != '/') sbUrl.Append('/');

    // found question mark already? query string, do not touch!
    bool foundQM = false;
    bool foundSlash; // the latest char was a slash?
    if (relativeUrl.Length > 1
        && relativeUrl[0] == '~'
        && (relativeUrl[1] == '/' || relativeUrl[1] == '//'))
    {
        relativeUrl = relativeUrl.Substring(2);
        foundSlash = true;
    }
    else foundSlash = false;
    foreach (char c in relativeUrl)
    {
        if (!foundQM)
        {
            if (c == '?') foundQM = true;
            else
            {
                if (c == '/' || c == '//')
                {
                    if (foundSlash) continue;
                    else
                    {
                        sbUrl.Append('/');
                        foundSlash = true;
                        continue;
                    }
                }
                else if (foundSlash) foundSlash = false;
            }
        }
        sbUrl.Append(c);
    }

    return sbUrl.ToString();
}
     在完成代碼后和比較原來ResolveUrl測試一遍又一遍,我開始測試性能...在大多數(shù)情況下,我的代碼執(zhí)行速度比原來快ResolveUrl 2.7倍!我也在循環(huán)內(nèi)部進行測試,用不同的URL執(zhí)行代碼100000次。

參考原文:http://www.codeproject.com/KB/aspnet/resolveurl.aspx

作者:朱祁林
出處:http://zhuqil.VEVb.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權(quán)利。
2 1 0
(請您對文章做出評價)
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 班戈县| 司法| 宁津县| 邯郸县| 洪湖市| 台湾省| 荆州市| 峨边| 阿鲁科尔沁旗| 武清区| 德格县| 桓台县| 东乡族自治县| 凯里市| 手机| 鄂托克前旗| 宣威市| 德化县| 肇州县| 武穴市| 米易县| 沁阳市| 绥滨县| 霍邱县| 互助| 西畴县| 文化| 鲁山县| 江达县| 安国市| 平遥县| 桦甸市| 大悟县| 南阳市| 黄石市| 汶上县| 南城县| 宕昌县| 江山市| 绥江县| 天全县|