我有Web api应用程序,我想使用Web api过滤器清理来自前端应用程序的数据。
我创建了以下过滤器:
public class StringFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
foreach (var actionArgument in actionContext.ActionArguments)
{
if (actionArgument.Value.GetType() == typeof(string))
{
var sanitizedString = actionArgument.Value.ToString().Trim();
sanitizedString = Regex.Replace(sanitizedString, @"\s+", " ");
actionContext.ActionArguments[actionArgument.Key] = sanitizedString;
}
else
{
var properties = actionArgument.Value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.CanRead && x.PropertyType == typeof(string) && x.GetGetMethod(true).IsPublic && x.GetSetMethod(true).IsPublic);
foreach (var propertyInfo in properties)
{
var sanitizedString = propertyInfo.GetValue(actionArgument.Value).ToString().Trim();
sanitizedString = Regex.Replace(sanitizedString, @"\s+", " ");
propertyInfo.SetValue(actionArgument.Value, sanitizedString);
}
}
}
}
}
这段代码的问题是if语句中的代码,我想对作为单个字符串传递的参数进行清理,但出现此错误:
“ ClassName”:“ System.InvalidOperationException”,“ Message”:“集合已被修改;枚举操作可能不会执行。
但是,如果我的Web api动作将参数作为具有字符串属性的dto对象,则该代码(在else语句内部)可以正常工作,并且在开始执行该动作之前先对字符串进行清理。
所以我的问题是如果是字符串参数,如何清理传递的参数?
您试图在枚举时修改同一集合,这是不允许的。进行调用,.ToList()
以便在修改原始集合时枚举单独的集合。即foreach (var actionArgument in actionContext.ActionArguments.ToList()) {...
public override void OnActionExecuting(HttpActionContext actionContext) {
foreach (var actionArgument in actionContext.ActionArguments.ToList()) {
if (actionArgument.Value != null && actionArgument.Value is string) {
var sanitizedString = actionArgument.Value.ToString().Trim();
sanitizedString = Regex.Replace(sanitizedString, @"\s+", " ");
actionContext.ActionArguments[actionArgument.Key] = sanitizedString;
} else {
var properties = actionArgument.Value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.CanRead && x.PropertyType == typeof(string) && x.GetGetMethod(true).IsPublic && x.GetSetMethod(true).IsPublic);
foreach (var propertyInfo in properties) {
var sanitizedString = propertyInfo.GetValue(actionArgument.Value).ToString().Trim();
sanitizedString = Regex.Replace(sanitizedString, @"\s+", " ");
propertyInfo.SetValue(actionArgument.Value, sanitizedString);
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句