如何避免在不同地方使用相同 key/value 查询字符串的重复网址?
How to avoid duplicate urls with same key/value query-string at different places?
我正在使用 Azure Redis 缓存,我的密钥是请求 url。我有一个 web-api2 / mvc5 应用程序,如果存在带有请求 url 的密钥,它 return 是来自 Redis 服务器的缓存结果,否则它将处理请求并将结果保存在 Azure Redis 缓存服务器中。我有 IOS/Android 和 javascript 的移动客户端。问题是有时我的 url 看起来像
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指向同一个资源。它应该 return 相同的响应(如果存在缓存响应)但由于密钥(url)不同,它会完全处理请求并在 Azure Redis 缓存服务器上保存不同的记录。如何解决这种情况?
使用 MVC 路由将为您提供 URL 的标准格式。
您将能够将默认的 html 助手与 ASP.NET 一起使用,例如 @Html.Action("MethodName","Controller",new { a=1, b=2 })
您可以在 RouteConfig.cs
class 中指定自定义路由模板(默认情况下在 app_start
中),或者您可以使用属性路由。
这就是我来得太快了,如有任何改进,我们将不胜感激,
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());
}
我正在使用 Azure Redis 缓存,我的密钥是请求 url。我有一个 web-api2 / mvc5 应用程序,如果存在带有请求 url 的密钥,它 return 是来自 Redis 服务器的缓存结果,否则它将处理请求并将结果保存在 Azure Redis 缓存服务器中。我有 IOS/Android 和 javascript 的移动客户端。问题是有时我的 url 看起来像
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指向同一个资源。它应该 return 相同的响应(如果存在缓存响应)但由于密钥(url)不同,它会完全处理请求并在 Azure Redis 缓存服务器上保存不同的记录。如何解决这种情况?
使用 MVC 路由将为您提供 URL 的标准格式。
您将能够将默认的 html 助手与 ASP.NET 一起使用,例如 @Html.Action("MethodName","Controller",new { a=1, b=2 })
您可以在 RouteConfig.cs
class 中指定自定义路由模板(默认情况下在 app_start
中),或者您可以使用属性路由。
这就是我来得太快了,如有任何改进,我们将不胜感激,
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());
}