C# 在CustomValidationAttribute调用的方法中,如何存储该方法的一些信息

C# 在CustomValidationAttribute调用的方法中,如何存储该方法的一些信息,c#,asp.net-web-api,C#,Asp.net Web Api,我有以下资料: /// <summary> /// Max length per string is 200 /// </summary> [CustomValidation(typeof(ProjectPixelValidator), "IsProjectPixelCollectionValid")] public IEnumerable<string> ProjectPixels { get; set; } // ///每个字符串的最大长度为200 //

我有以下资料:

/// <summary>
/// Max length per string is 200
/// </summary>
[CustomValidation(typeof(ProjectPixelValidator), "IsProjectPixelCollectionValid")]
public IEnumerable<string> ProjectPixels { get; set; }
//
///每个字符串的最大长度为200
/// 
[CustomValidation(typeof(ProjectPixelValidator),“IsProjectPixelCollectionValid”)]
公共IEnumerable项目像素{get;set;}
为了确定它是否有效,我必须调用数据库以获取特定于当前用户的验证信息

实际方法示例:

public const int MaxPixelLength = 200;
public static ValidationResult IsProjectPixelCollectionValid(IEnumerable<string> projectPixels, ValidationContext context)
{ /* ... omitted code ... */ 
    return ValidationResult.Success;
}
public const int MaxPixelLength=200;
公共静态验证结果IsProjectPixelCollectionValid(IEnumerable projectPixels,ValidationContext上下文)
{/*…省略的代码…*/
返回ValidationResult.Success;
}
如果它是有效的,我将不得不调用相同的方法来获取验证所需的数据。我意识到我可以把它放在asp.net中存在的2-3个缓存系统中(
MemoryCache
等等),但我希望找到更具体的请求

我记得,在MVC中,我可以将其添加到路由数据字典中

我是否可以将此信息存储在某个位置,告诉web API它可以使用该数据作为方法的参数之一,或者存储在某个位置,该位置仅在操作可以调用的请求长度内有效


我对允许或启用方法注入的选项有偏好。

您可以将HTTP请求期间应存储的任何内容存储在
HttpRequestMessage
上的
属性
字典中。您可以在所有Web API组件(消息处理程序、筛选器、控制器,甚至格式化程序)中访问当前的
HttpRequestMessage
,因此该位置非常合适

它是一个
IDictionary
,因此可以保存任何对象,Web API本身也在其中存储大量信息(例如错误级别的详细信息、对HttpContext的引用、标记请求是否为本地等)

您还可以使用一些扩展方法来帮助您处理添加和检索该词典中的内容:

public static class HttpRequestMessageExtensions
{
    public static void Add(this HttpRequestMessage request, string key, object o)
    {
        request.Properties.Add(key, o);
    }

    public static T Get<T>(this HttpRequestMessage request, string key)
    {
        object result;
        if (request.Properties.TryGetValue(key, out result))
        {
            if (result is T)
            {
                return (T) result;
            }
            try
            {
                return (T)Convert.ChangeType(result, typeof (T));
            }
            catch (InvalidCastException) {}
        }

        return default(T);
    }
}
公共静态类HttpRequestMessageExtensions
{
公共静态void Add(此HttpRequestMessage请求、字符串键、对象o)
{
请求.属性.添加(键,o);
}
公共静态T Get(此HttpRequestMessage请求,字符串键)
{
客观结果;
if(request.Properties.TryGetValue(key,out结果))
{
如果(结果为T)
{
返回(T)结果;
}
尝试
{
return(T)Convert.ChangeType(result,typeof(T));
}
catch(InvalidCastException){}
}
返回默认值(T);
}
}