Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 3.1中控制器级JsonOutputFormatter的替代方案_C#_Asp.net Core_Asp.net Core 3.1 - Fatal编程技术网

C# ASP.NET Core 3.1中控制器级JsonOutputFormatter的替代方案

C# ASP.NET Core 3.1中控制器级JsonOutputFormatter的替代方案,c#,asp.net-core,asp.net-core-3.1,C#,Asp.net Core,Asp.net Core 3.1,我有一个定制的过滤器属性,它是根据当前为.NET Core 2.2实现的,我想适应3.1。它引用了Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式 守则如下: public class AllPropertiesAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext ctx) { if (!(ctx.Resul

我有一个定制的过滤器属性,它是根据当前为.NET Core 2.2实现的,我想适应3.1。它引用了Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式

守则如下:

public class AllPropertiesAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        if (!(ctx.Result is ObjectResult objectResult)) return;

        var serializer = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include };
        serializer.Converters.Add(new StringEnumConverter());

        var formatter = new JsonOutputFormatter(serializer, 
                        ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>());

        objectResult.Formatters.Add(formatter);
    }
}
公共类所有属性属性:ActionFilterAttribute
{
公共覆盖无效OnActionExecuted(ActionExecuteContext ctx)
{
如果(!(ctx.Result为ObjectResult ObjectResult))返回;
var serializer=newjsonserializersettings{NullValueHandling=NullValueHandling.Include};
添加(新的StringEnumConverter());
var formatter=新的JsonOutputFormatter(序列化程序,

ctx.HttpContext.RequestServices.GetRequiredService;我应该如何继续保持3.1下的相同行为?

Net Core 2.2->3.0的迁移指南包含此信息

jist,您可以使用它,您只需手动添加包,因为默认情况下不再包括它

  • 添加对AspNetCore.Mvc.NewtonsoftJson的包引用
  • 将以下内容添加到Startup.ConfigureServices方法中

      services.AddMvc()
          .AddNewtonsoftJson();
    
  • 配置


与旧的JsonOutputFormatter等效的是Microsoft.AspNetCore.Mvc.NewtonsoftJson包中的NewtonSofJSONOutputFormatter。它有一个小改动,在构造函数中也接受MVCOPions:

    public NewtonsoftJsonOutputFormatter(
        JsonSerializerSettings serializerSettings,
        ArrayPool<char> charPool,
        MvcOptions mvcOptions)
public newtonsoftjsonoutformatter(
JsonSerializerSettings序列化rSettings,
ArrayPool charPool,
mvcopions(mvcopions)

这只会通过选项真正影响行为。您可能可以从RequestServices中解决它,也可以动态创建一个新的。Net Core 3附带了它,默认情况下不再包含Json.Net

作为替代方案,如果这是可能的,您可以使用本机而不是包含另一个包

使用Microsoft.AspNetCore.Mvc.Formatters;
公共覆盖无效OnActionExecuted(ActionExecuteContext ctx)
{
如果(!(ctx.Result为ObjectResult ObjectResult))返回;
var serializer=newjsonserializeroptions{IgnoreNullValues=false};
Add(新的jsonStringUnumConverter());
var formatter=newsystemtextjsonoutputformatter(序列化程序);
objectResult.Formatters.Add(格式化程序);
}

@MikeZboray感谢您的回复-我尝试切换到本机格式化程序的尝试停止了,因为我了解到它的行为方式不同,在发出JSON响应时忽略派生类型的属性;这就是我坚持使用Newtonsoft.JSON的原因,至少目前是这样。更多信息:是的,我错过了您出于兼容性原因,我想继续使用newtonsoft。我认为Mvc.NewtonsoftJson包是您想要查看的地方。具体来说,NewtonsoftJsonOutputFormatter似乎是等效的输出格式化程序。@MikeZboray我不敢相信我错过了那一个-尝试了它,它工作得非常完美,只做了一些小的更改。您能发布一个答案让我知道吗可以接受吗?谢谢Josh,这与我在初始化时的情况非常接近。我的问题的重点略有不同-我希望在控制器级别有不同的序列化行为(即,以不同方式处理响应序列化的方法)不过我还是很感谢你花了这么多时间来回答。谢谢你的回答,SanBen。我最终决定坚持使用NewtonsoftJson,因为JsonOutputFormatter的设计选择——即它忽略了派生类型的属性。