使用IIS 8.5托管的ASP.Net Core Web Api应用程序时遇到一些困难。 IIS 8.5针对特定的发布请求返回400状态代码。
错误请求由Web应用程序执行,该Web应用程序托管在同一域中且具有不同的端口。已将API配置为处理cors,并且成功完成了错误请求的预检。
我注意到了一件奇怪的事情: 部署了Api,其中包括Swagger UI。因此,我尝试使用Swagger UI重现该错误。但是在这种情况下,请求成功。 这两个请求的正文和url绝对相同,并且标头中没有任何明显的区别,当然,除了请求的来源。
看起来请求根本没有被Api处理(在这种情况下,我应该会在日志文件中看到某件事),因此,我很确定该错误发生在IIS本身的某个地方。
我已经研究过httperr.log文件。它包含请求失败时的流线:
2018-12-05 15:38:36 192.168.100.132 62121 192.168.100.173 1142 HTTP / 1.1 POST / api / some / request / path 400 13 BadRequest myServicePool
我希望此文件包含有关错误原因的更多详细信息。 我想知道“ BadRequest”前的“ 13”是否有特殊含义?
有人根据给出的信息有一个想法,为什么会发生此错误?我真的不这么认为。但是,如果有人可以给我一个提示,可以在哪里搜索有关错误原因的更多详细信息,我将非常高兴。 让我知道您是否需要更多详细信息。
答案 0 :(得分:0)
最好在代码中提供示例代码,以说明如何发送请求。
但是,根据给定的事实,我认为问题出在请求主体的内容中。甚至连招摇的请求和您发送的请求看起来也完全一样,在某些方面也应该有所不同。
您是否正在使用JSON转换器?如果您使用的是JSON转换器,并且要将.NET模型序列化为JSON字符串并附加到请求中,请确保使用 Camel Case 对其进行格式化。
因为默认情况下,它可能只是按Pascal情况转换.NET模型。
示例
我将使用 Newtonsoft JSON 库对此进行详细说明。
.NET模型序列化而未指定格式
var businessLeadJson = JsonConvert.SerializeObject(ObjectA);
已转换的结果-{"Company":"sample","ContactName":"contact 1"}
通过指定格式序列化的.NET模型
var businessLeadJson = JsonConvert.SerializeObject(businessLead, new
JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() });
已转换的结果-{"company":"sample","contactName":"contact 1"}
请注意JSON字符串中属性名称的大小写。第一个字母第一个字母为大写。
因此,我建议您尝试通过指定格式来序列化作为有效负载(请求主体)附加的对象,因为REST API期望JSON字符串采用正确的格式。
在序列化请求正文的对象时,请指定驼峰格式。
祝你好运..
答案 1 :(得分:0)
我只是设法偶然重现此错误。
问题是,如果用户尚未登录,则应用程序将发送一个空的Authorization-Header。
似乎在某些配置/ IIS版本上,或者在系统之间有什么区别的情况下,都会导致请求失败,在某些情况下也没问题。