如何在每次Web API调用后重置序列化:C# [英] How to reset serialization after each web api call : 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屋!