0

キーが要求 URL である Azure Redis キャッシュを使用しています。私は web-api2 / mvc5 アプリケーションを持っています。これは、要求 URL を持つキーがそこに存在する場合、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 は同じリソースを指しています。同じ応答 (存在する場合はキャッシュされた応答) を返す必要がありますが、キー (url) が異なるため、要求を完全に処理し、別のレコードを Azure Redis キャッシュ サーバーに保存します。このシナリオを解決するには?

4

2 に答える 2

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());
    }
于 2015-04-28T11:56:59.737 に答える
1

MVC ルーティングを使用すると、URL に標準形式が提供されます。

次のような ASP.NET でデフォルトの html ヘルパーを使用できます。@Html.Action("MethodName","Controller",new { a=1, b=2 })

RouteConfig.csクラス (既定では In )でカスタム ルーティング テンプレートを指定するapp_startか、属性ルーティングを使用できます。

MSDN : MVC5 属性ルーティング

于 2015-04-28T09:23:00.157 に答える