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);
            });