【问题标题】:ASP.NET Core WebAPI responds with JSON from /api/ but 406 from /*ASP.NET Core Web API 响应来自 /api/ 的 JSON,但来自 /* 的 406
【发布时间】:2018-04-28 00:31:01
【问题描述】:

我有一个简单的 WebAPI 项目,为方便起见,我创建了另一个控制器(具有相同的继承和行为,就像其他 API 控制器一样,我们现在称之为 App)用于登录、注册和加载单页站点。 App的基本位置是'/',api端点在'/api/'下。

如果我从“/api/”下调用方法,则响应是预期的 json 对象。但是,例如,当我从 App 调用 register (/register) 时,它成功了,它返回包装在“Ok”调用中的新创建的用户实体,但是一些中间件阻止了该过程并返回状态码 406 并带有一个空的 http身体。

我只使用默认的服务器设置,我没有篡改中间件。我在最基本的教程中添加了swagger,启用了静态资源,仅此而已。

我知道 406 是什么,我在客户端中将 Accept 标头设置为“application/json”。当我在 Visual Studio 中调试调用时,它确实包含 Request 属性中的 Accept 信息。

仅当我不在“/api/”路线中时才会发生这种情况。我怎样才能改变这种行为,以便我在“接受”中输入的任何内容,asp.net 都会尝试以该格式序列化数据?因为现在如果当前路由不在'/api/'下,它会以某种方式决定忽略标头的意图

编辑:我找到了一个非常弱的解决方案。如果我手动设置状态码(对于 200 以外的情况),而不是手动调用 Json 方法来返回 JsonResult,它可以工作。但这不是您对框架的期望,它应该为给定的 Accept 值找到合适的转换器。

【问题讨论】:

    标签: asp.net json rest asp.net-web-api asp.net-core


    【解决方案1】:

    回答我自己的问题。这是一个简单的错误。控制器类有一个名为 [Produces("text/html")] 的属性,我忽略了它,因此每个方法在响应中都被序列化为 html,而忽略了我发送的 Accept: 标头。我遇到的奇怪行为,即 api 工作正常但 'not-api' 没有,是因为 '/api/' 下的每个控制器都用 [Produces("application/json")] 属性注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2016-08-06
      • 2019-02-09
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多