gpt4 book ai didi

c# - 为 ASP.NET Web API 中的单个请求更改 JsonFormatter

转载 作者:行者123 更新时间:2023-11-30 12:58:48 25 4
gpt4 key购买 nike

我有一个如下定义的 Action 过滤器,在我的 Web API 项目中全局注册:

public class ResultCasingFilter : IActionFilter
{
private static JsonMediaTypeFormatter _pascalCasingFormatter;
private static JsonMediaTypeFormatter _camelCasingFormatter;

// Constructor that initializes formatters left out for brevity

public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
actionContext.RequestContext.Configuration.Formatters.Clear();
actionContext.RequestContext.Configuration.Formatters.Add(
ResponseShouldBePascalCased(actionContext)
? _pascalCasingFormatter
: _camelCasingFormatter);
return continuation();
}

private static bool ResponseShouldBePascalCased(HttpActionContext actionContext)
{
return actionContext.ActionDescriptor
.GetCustomAttributes<PascalCasedResultAttribute>().Any();
}

public bool AllowMultiple { get { return false; } }
}

这工作得很好,但我似乎在请求之间受到干扰;如果我一次向操作方法发出一个请求,其中一个有 PascalCasedResultAttribute 而一个没有,一切都会按预期工作 - 但如果我发出两个彼此非常接近的请求,有时两者都会结束具有相同的外壳。

我将此行为解释为对 actionContext.RequestContext.Configuration.Formatters 的更改确实更改了整个应用程序的配置,而不仅仅是当前请求的配置,有时请求重叠.基本上,我的解决方案基于以下事件序列:

  1. 请求 1 选择它的序列化器
  2. 请求 1 使用最后选择的序列化器序列化
  3. 请求 2 选择它的序列化器
  4. 请求 2 使用最后选择的序列化器序列化

请注意,如果第二步和第三步改变顺序,行为也会改变。我想要的是相当

  1. 请求 1 选择它的序列化器
  2. 请求 1 使用序列化器 1 序列化
  3. 请求 2 选择它的序列化器
  4. 请求 2 使用序列化器 2 序列化

我(或框架)可以在不改变行为的情况下切换 2 和 3 的顺序。

我如何最好地完成此任务?

最佳答案

问题是您正在更改一个全局变量,这显然在排序上不一致。

您可以做的是在操作中手动序列化并返回适当的字符串。

然后您可以提供一个标志来选择在您的请求中使用哪个序列化程序,或者使用 cookie 来记住客户端的选择。

关于c# - 为 ASP.NET Web API 中的单个请求更改 JsonFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28407685/

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