-
Notifications
You must be signed in to change notification settings - Fork 249
Expand file tree
/
Copy pathDefaultCacheKeyGenerator.cs
More file actions
91 lines (80 loc) · 3.68 KB
/
DefaultCacheKeyGenerator.cs
File metadata and controls
91 lines (80 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http.Controllers;
namespace WebApi.OutputCache.V2
{
public class DefaultCacheKeyGenerator : ICacheKeyGenerator
{
public virtual string MakeCacheKey(HttpActionContext context, MediaTypeHeaderValue mediaType, bool excludeQueryString = false)
{
var key = MakeBaseKey(context);
var parameters = FormatParameters(context, excludeQueryString);
return string.Format("{0}{1}:{2}", key, parameters, mediaType);
}
protected virtual string MakeBaseKey(HttpActionContext context)
{
var controller = context.ControllerContext.ControllerDescriptor.ControllerType.FullName;
var action = context.ActionDescriptor.ActionName;
return context.Request.GetConfiguration().CacheOutputConfiguration().MakeBaseCachekey(controller, action);
}
protected virtual string FormatParameters(HttpActionContext context, bool excludeQueryString)
{
var actionParameters = context
.ActionArguments
.Where(x => x.Value != null && (x.Value is string || x.Value.GetType().IsValueType))
.Select(x => x.Key + "=" + GetValue(x.Value));
string parameters;
if (!excludeQueryString)
{
var queryStringParameters =
context.Request.GetQueryNameValuePairs()
.Where(x => x.Key.ToLower() != "callback")
.Select(x => x.Key + "=" + x.Value);
var parametersCollections = actionParameters.Union(queryStringParameters);
parameters = "-" + string.Join("&", parametersCollections);
var callbackValue = GetJsonpCallback(context.Request);
if (!string.IsNullOrWhiteSpace(callbackValue))
{
var callback = "callback=" + callbackValue;
if (parameters.Contains("&" + callback)) parameters = parameters.Replace("&" + callback, string.Empty);
if (parameters.Contains(callback + "&")) parameters = parameters.Replace(callback + "&", string.Empty);
if (parameters.Contains("-" + callback)) parameters = parameters.Replace("-" + callback, string.Empty);
if (parameters.EndsWith("&")) parameters = parameters.TrimEnd('&');
}
}
else
{
parameters = "-" + string.Join("&", actionParameters);
}
if (parameters == "-") parameters = string.Empty;
return parameters;
}
private string GetJsonpCallback(HttpRequestMessage request)
{
var callback = string.Empty;
if (request.Method == HttpMethod.Get)
{
var query = request.GetQueryNameValuePairs();
if (query != null)
{
var queryVal = query.FirstOrDefault(x => x.Key.ToLower() == "callback");
if (!queryVal.Equals(default(KeyValuePair<string, string>))) callback = queryVal.Value;
}
}
return callback;
}
private string GetValue(object val)
{
if (val is IEnumerable && !(val is string))
{
var concatValue = string.Empty;
var paramArray = val as IEnumerable;
return paramArray.Cast<object>().Aggregate(concatValue, (current, paramValue) => current + (paramValue + ";"));
}
return val.ToString();
}
}
}