如何在每次Web API调用后重置序列化:C# [英] How to reset serialization after each web api call : C#

查看:109
本文介绍了如何在每次Web API调用后重置序列化:C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对特定的API调用使用了 custom json序列化. 但是它会覆盖全局格式.我需要在此API调用之后或在所有其他API调用开始时重置此序列化.

I have used custom json serialization for a particular API call. But it overrides the global format. I need to reset this serialization after this API call or at the beginning of all other API calls.

public class ShouldSerializeContractResolver : CamelCasePropertyNamesContractResolver
{
    private List<Serializable> _serializables;

    public ShouldSerializeContractResolver(List<Serializable> serializable)
    {
        _serializables = serializable;
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        foreach (var item in _serializables)
        {
            if (item.ObjectType.Contains(property.DeclaringType) && !item.Serialize.Contains(property.PropertyName))
            {
                property.ShouldSerialize =
                   instance =>
                   {
                       return false;
                   };
            }
        }

        return property;
    }
}

我直接从API控制器调用了此序列化器,如下所示:

And I called this serializer from API controller directly as shown below:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

    List<Serializable> serializableList = new List<Serializable>(); // Model class for storing list of Model classes and corresponding serializable objects as string
        List<Type> listObjectType = new List<Type>();
        List<string> serialize = new List<string>();

        listObjectType.Add(typeof(ModelClassName));
        serialize.Add("classObject1");
        serialize.Add("classObject2");
        serializableList.Add(new Serializable
        {
            Serialize = serialize,
            ObjectType = listObjectType
        });

    json.SerializerSettings.ContractResolver = new ShouldSerializeContractResolver(serializableList); // This is where the serializer is modified

推荐答案

我添加了"ResetSerializeContractResolverFilter.cs"作为过滤器.

I've added a "ResetSerializeContractResolverFilter.cs" as a filter.

    public class ResetSerializeContractResolverFilter : System.Web.Http.Filters.ActionFilterAttribute
    {
    public ResetSerializeContractResolverFilter()
    {

    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
        json.SerializerSettings.ContractResolver = new DefaultContractResolver();
        base.OnActionExecuting(actionContext);
    }
    }

然后,我从Application_Start的"Global.asax"中添加了该过滤器,如下所示

Then I included that filter from "Global.asax", Application_Start as shown below

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        // Add filter for resetting contractresolver
        var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters;
        filters.Add(new ResetSerializeContractResolverFilter());
    }

因此,此过滤器将在每个API调用中调用,并使序列化程序重置为默认值.

Hence this filter will be invoked in each API call and gets the serializer to reset as Default.

这篇关于如何在每次Web API调用后重置序列化:C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆