gpt4 book ai didi

c# - 使用 ASP.NET Core 2.1 在 Controller 上配置输入/输出格式化程序

转载 作者:行者123 更新时间:2023-12-04 01:53:46 27 4
gpt4 key购买 nike

我正在将旧的 ASP.NET WebAPI 2.1 项目重写为 ASP.NET Core MVC 2.1。我面临的问题之一是移植服务的旧行为,该服务通过实现 IControllerConfiguration 接口(interface)的自定义属性配置输入和输出格式化程序。除了使用 AddMvc(options) 方法在全局级别注入(inject)它们之外,我无法找到此接口(interface)的替代品,也无法找到基于 Controller 配置格式化程序的任何替代品。

最佳答案

我还没有找到可以在 Controller 级别配置的任何内容,但我确实找到了一个解决方案,该解决方案涉及对您需要此功能的每个操作进行更改。在我的情况下,我需要自定义 JSON 序列化程序设置,对于输出可以这样做:

[HttpGet]
public IActionResult Get()
{
...
return Json(result, _serializerSettings);
}

像这样输入:
[HttpPost]
public IActionResult Post([FromBodyCustomSerializationSettings]MyPostDto postDto)
{
...
}

class FromBodyCustomSerializationSettingsAttribute : ModelBinderAttribute
{
public FromBodyCustomSerializationSettingsAttribute() : base(typeof(MyModelBinder))
{
BindingSource = BindingSource.Body;
}
}

class MyModelBinder : IModelBinder
{
private readonly BodyModelBinder _bodyModelBinder;

public MyModelBinder(IHttpRequestStreamReaderFactory readerFactory, ILoggerFactory loggerFactory, IOptions<MvcOptions> options, IOptions<MvcJsonOptions> jsonOptions, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider)
{
var formatters = options.Value.InputFormatters.ToList();
int jsonFormatterIndex = formatters.FirstIndexOf(formatter => formatter is JsonInputFormatter);
JsonSerializerSettings myCustomSettings = ...
formatters[jsonFormatterIndex] = new JsonInputFormatter(loggerFactory.CreateLogger("MyCustomJsonFormatter"), myCustomSettings, charPool, objectPoolProvider, options.Value, jsonOptions.Value);
_bodyModelBinder = new BodyModelBinder(formatters, readerFactory, loggerFactory, options.Value);
}

public Task BindModelAsync(ModelBindingContext bindingContext)
{
return _bodyModelBinder.BindModelAsync(bindingContext);
}
}

关于c# - 使用 ASP.NET Core 2.1 在 Controller 上配置输入/输出格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51769415/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com