Model view controller 在自定义MediaType格式化程序中使用序列化时出错
我用每请求逻辑实现了自定义媒体类型格式化程序Model view controller 在自定义MediaType格式化程序中使用序列化时出错,model-view-controller,json.net,mediatypeformatter,Model View Controller,Json.net,Mediatypeformatter,我用每请求逻辑实现了自定义媒体类型格式化程序 public class JsonPermissionBasedFormatter : PartialJsonMediaTypeFormatter { public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
public class JsonPermissionBasedFormatter : PartialJsonMediaTypeFormatter
{
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
{
User user = request.GetOwinContext()?.Request.Get<User>("AuthorizationFilter:CurrentUser");
var formatter = (PartialJsonMediaTypeFormatter)base.GetPerRequestFormatterInstance(type, request, mediaType);
formatter.SerializerSettings = SerializerSettings;
formatter.SerializerSettings.ContractResolver = new PermissionBasedContractResolver(user);
return formatter;
}
}
偶尔为普通用户获取json属性,仅对管理员负责。我不明白这怎么会发生。
若通过邮递员手动运行请求,则问题只能在某些负载下重现-一切正常。你能告诉我它可能是什么,或者给出如何调查此类问题的建议。1)什么是PartialJsonMediaTypeFormatter
?它是?2) 您能否共享重现此问题的PermissionsHelper.IsPropertyVisibleForUser()
版本?它是否静态缓存任何数据?1)是的,它是PartialResponse.Net.Http.Formatting的标准实现2)否,它不缓存任何信息,添加了源代码。
public PermissionBasedContractResolver(User user)
{
_user = user;
NamingStrategy = new CamelCaseNamingStrategy
{
ProcessDictionaryKeys = true,
OverrideSpecifiedNames = true
};
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
if (member == null)
{
throw new ArgumentNullException(nameof(member));
}
JsonProperty property = base.CreateProperty(member, memberSerialization);
var propertyInfo = member as PropertyInfo;
if (propertyInfo != null)
{
if (!PermissionsHelper.IsPropertyVisibleForUser(propertyInfo, _user))
{
property.ShouldSerialize = DoNotSerialize;
}
}
return property;
}
static bool DoNotSerialize(object o)
{
return false;
}
}
public static bool IsPropertyVisibleForUser(PropertyInfo info, User user)
{
if (info.GetCustomAttribute<IgnoreDataMemberAttribute>() != null)
return false;
if (user == null) return true;
var permissionForExportAttribute =
info.GetCustomAttribute<VisibleForAttribute>();
if (permissionForExportAttribute != null)
{
return
user.HasPermission(permissionForExportAttribute.Permission);
}
return true;
}
Parallel.For(1, 10000, _ =>
{
Get(ordinaryUser, isAdmin: false);
Get(adminUser, isAdmin: true);
});