2015-04-28 51 views
0

我正在使用Azure Redis緩存與我的密鑰是請求url。我有一個web-api2/mvc5應用程序,它返回來自Redis服務器的緩存結果,如果密鑰與請求url存在,否則它會處理請求並將結果保存在Azure Redis緩存服務器中。我有iOS/Android的移動客戶端以及JavaScript。問題是,有一段時間我的網址看起來像,如何避免在不同地方使用相同的鍵/值查詢字符串重複的網址?

http://example.com/MyPath/?b=2&a=1&c= 
http://example.com/MyPath/?b=2&a=1&c 
http://example.com/MyPath/?a=1&b=2 
http://example.com/MyPath/?c=&a=1&b=2 
http://example.com/MyPath/?a=1&b=2 
http://example.com/MyPath/?a=1&b=2&c= 

以上url指向相同的資源。它應該返回相同的響應(緩存響應,如果存在),但由於key(​​url)不同,它會完全處理請求並在Azure Redis緩存服務器上保存不同的記錄。如何解決這種情況?

回答

1

這裏是我來得如此之快,任何改進可以理解的,

private static string SanitizeUrl(string url) 
    { 
     var uri = new Uri(url); 
     var path = uri.GetLeftPart(UriPartial.Path); 
     path += path.EndsWith("/") ? "" : "/"; 
     var query = uri.ParseQueryString(); 
     var dict = new SortedDictionary<string, string>(query.AllKeys 
      .Where(k => !string.IsNullOrWhiteSpace(query[k])) 
      .ToDictionary(k => k, k => query[k])); 
     return (path + ToQueryString(dict)).ToLower(); 
    } 

    private static string ToQueryString(SortedDictionary<string, string> dict) 
    { 
     var items = new List<string>(); 
     foreach (var entry in dict) 
     { 
      items.Add(string.Concat(entry.Key, "=", Uri.EscapeUriString(entry.Value))); 
     } 
     return (items.Count > 0 ? "?" : "") + string.Join("&", items.ToArray()); 
    } 
+0

僅供參考 - HttpUtility.ParseQueryString( 「」)返回一個NameValueCollection中,實際上是一個HttpValueCollection。在HttpValueCollection上調用.ToString將返回格式化的查詢字符串。示例 - > http://pastebin.com/A0DwH9w5 –

+0

@JeremyBell在我的情況下感謝它的web api :) – user960567

0

使用MVC路由將爲您的URL提供標準格式。

你將能夠使用與ASP.NET默認的HTML助手,如@Html.Action("MethodName","Controller",new { a=1, b=2 })

你可以(在默認情況下在app_start)指定您RouteConfig.cs類自定義路由模板,也可以使用屬性的路由。

MSDN: MVC5 Attribute Routing

相關問題