用.NET MVC寫一個短網址服務

          最近公司在C端功能上出現了比較多的二維碼分享功能,由于是基于微信,所以二維碼需要編碼的內容很長,導致二維碼很密比較難識別。所以我寫了一個比較簡單的短網址服務,今天來分享一下。

          雖然說短網址比較簡單,但是在做的過程中還是有比較多需要考慮的關鍵點。按照網上各大服務商提供的短網址服務,基本是大小寫字母和數字,所以算法基本類似,我沒過多研究,在網上找了一個,如下:

          /// <summary>
          /// 轉換鏈接為短碼
          /// </summary>
          /// <param name="url">鏈接</param>
          /// <returns>4個短碼集合長度</returns>
          public static string[] ShortUrl(string url)
          {
              // 可以自定義生成 MD5 加密字符傳前的混合 KEY
              string key = "fangsi";
              // 要使用生成 URL 的字符
              string[] chars = new string[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,
          "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" ,
          "u" , "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" ,
          "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" ,
          "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,
          "U" , "V" , "W" , "X" , "Y" , "Z" };
          
              // 對傳入網址進行 MD5 加密
              string sMD5EncryptResult = Tools.MD5(key + url);
              string hex = sMD5EncryptResult;
          
              string[] resUrl = new string[4];
              for (int i = 0; i < 4; i++)
              {
                  // 這里需要使用 long 型來轉換,因為 Inteper .parseInt() 只能處理 31 位 , 首位為符號位 , 如果不用 long ,則會越界
                  int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16);
                  string outChars = string.Empty;
                  for (int j = 0; j < 6; j++)
                  { // 把得到的值與 0x0000003D 進行位與運算,取得字符數組 chars 索引 long index = 0x0000003D & hexint; // 把取得的字符相加 outChars += chars[index]; // 每次循環按位右移 5 位 hexint = hexint >> 5;
                  }
                  // 把字符串存入對應索引的輸出數組
                  resUrl[i] = outChars;
              }
              return resUrl;
          }

          通過以上的方法就能將網址編碼為短碼,再進行存儲,那么在生成前需要注意什么嗎? 當然是可以去考慮一下網址的真實性的,所以就有了驗證網址是否正??稍L問的代碼:

          /// <summary>
          /// 網址有效性檢查
          /// </summary>
          /// <param name="url">需要檢查的url,ip地址也可以</param>
          /// <returns>是否可用</returns>
          public static bool UrlIsOK(string url)
          {
              try
              {
                  if (!url.Contains("http"))
                  {
                      return false;
                  }
                  HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
                  myRequest.Method = "HEAD";
                  myRequest.Timeout = 5000; //超時時間5秒
                  HttpWebResponse res = (HttpWebResponse)myRequest.GetResponse();
                  return ((int)res.StatusCode < 400);
              }
              catch
              {
                  try
                  {
                      HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
                      myRequest.Method = "GET";
                      myRequest.Timeout = 5000; //超時時間5秒
                      HttpWebResponse res = (HttpWebResponse)myRequest.GetResponse();
                      return ((int)res.StatusCode < 400);
                  }
                  catch
                  {
                      return false;
                  }
              }
          }

          這里利用HEAD進行請求,消耗資源比較小,但是在使用的時候發現HEAD對于有些服務并不能正常的響應。所以就增加了一個GET請求,確保網址能被正確的驗證。 驗證完網址,并生成短碼后,存儲到數據庫時新的問題來了,如何在MVC中能做到像其它服務一樣進行域名后跟短碼“http://t.cn/Rz6ka2d”這中形式的鏈接呢? 其實很簡單,加入我們進行跳轉的控制器名為“Url”,action的名稱為“Jump”,那么我們只需在路由中新增規則:

          routes.MapRoute(
              name: "ShortUrl",
              url: "{key}",
              defaults: new { controller = "Url", action = "Jump", id = UrlParameter.Optional }
          );

          這樣就可以實現域名后跟短碼進行訪問,并且不會影響到其它的控制器。到這里已經可以實現將網址驗證后生成短碼,并實現了短碼接收。但是我做的時候是通過SQLServer數據庫進行短碼存儲的,因為SQLServer默認查詢where條件是不區分大小寫的,所以還需要在查詢的SQL后帶上:“COLLATE Chinese_PRC_CS_AS” 即可。

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

          本文采用知識共享署名-非商業性使用-相同方式共享

          如若轉載,請注明出處:《用.NET MVC寫一個短網址服務》http://www.solariosolutions.com/1360.html

          (11)
          打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
          鋒哥的頭像鋒哥管理員
          上一篇 2019年2月26日 18:32
          下一篇 2019年3月13日 22:24

          相關推薦

          發表回復

          登錄后才能評論

          評論列表(2條)

          • 5025
            5025 2023年9月12日 09:56

            您好, 按照您說的設置路由規則后,請求返回404,還需要設置什么嘛?謝謝

            • 鋒哥的頭像
              鋒哥 2023年9月13日 09:21

              @5025需要創建名為Url的控制器,并且在控制器內實現一個名為Jump的Action哦。

          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片