我有一个简单的WebAPI项目,为方便起见,我创建了另一个控制器(具有相同的继承和行为,就像其他API控制器一样,我们现在称之为App),用于登录,注册和加载单页网站。 App的基本位置是'/',api端点在'/ api /'。
下如果我从'/ api /'下调用方法,则响应是预期的json对象。但是当我从App调用register(/ register)时,它成功了,它返回包含在'Ok'调用中的新创建的用户实体,但是一些中间件阻止该进程并用空的http返回状态代码406。身体。
我只使用默认的服务器设置,我没有篡改中间件。我添加了swagger最基本的教程,启用了静态资源,但这就是全部。
我知道406是什么,我在我的客户端中将Accept标头设置为'application / json'。当我在visual studio中调试调用时,它确实在Request属性中包含了Accept信息。
只有当我不在'/ api /'路线时才会发生这种情况。我怎样才能改变这种行为,以便无论我在“接受”中放置什么,asp.net都会尝试以该格式序列化数据?因为如果当前路线不在'/ api /'下,它现在以某种方式决定忽略标题的意图
编辑:我发现了一个非常弱的解决方案。如果我手动设置状态代码(对于200以外的情况),而不是手动调用Json方法,返回JsonResult,它可以工作。但这不是您对框架的期望,应该为给定的Accept值找到适当的转换器。
答案 0 :(得分:1)
回答我自己的问题。这是一个简单的错误。控制器类有一个我忽略的名为IntelliJ IDEA 2017.2.6
Build #IC-172.4574.11, built on November 13, 2017
JRE: 1.8.0_152-release-915-b12 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.10.0-38-generic
的属性,因此每个方法都在响应中被序列化为html,而忽略了我发送的[Produces("text/html")]
标题。我经历过的奇怪行为,api工作得很好,但是没有 - api'并不是因为每个控制器都在' / api /'使用Accept:
属性进行注释。